Unity中模拟生成正态分布的一种方式

news2025/1/23 4:10:57
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;

public class MathFunction : MonoBehaviour
{
    private void Start()
    {
        //key 范围 0-99 表示 0% 到 99%
        Dictionary<int,uint> m = new Dictionary<int, uint>();
        for (int i = 0; i < 100; i++)
        {
            m[i] = 0;
        }
        //f(x)为正态函数在[0,x]区间的积分
        //y = f(x)函数的逆函数 x = f(y)
        //x 精确到 0.0000 到 0.4999 (正态函数在零到正无穷积分值为0.5000)
        //y 在 x = 0.4999 时 最大 y = 3.71905 指定 MAX_F 为 3.8
        float MAX_F = 3.8f;
        for (int i = 0;i < 1000000; i++)
        {
            int num = UnityEngine.Random.Range(0,5000);
            float numR = num / 10000f;
            float posf = MyErfinv(numR * 2f) * Mathf.Sqrt(2f);
            int pos = (int)(posf / MAX_F * 100f);

            if (pos >= 100){pos = 99;}
            if (pos < 0){pos = 0;}
            m[pos]++;
        }
        string str = "";
        for(int i = 0;i < m.Count ; i++)
        {
            str += "百分之"+i.ToString()+" "+m[i].ToString()+" \n";
        }
        Debug.Log(str);
    }
    // 修正的逆误差函数
    private float MyErfinv(float a)
    {
        float p, r, t;
        t = MyFma(a, -a, 1.0f);
        t = MyLog(t);
        if (Mathf.Abs(t) > 6.125f)
        {
            p = 3.03697567e-10f;
            p = MyFma(p, t, 2.93243101e-8f);
            p = MyFma(p, t, 1.22150334e-6f);
            p = MyFma(p, t, 2.84108955e-5f);
            p = MyFma(p, t, 3.93552968e-4f);
            p = MyFma(p, t, 3.02698812e-3f);
            p = MyFma(p, t, 4.83185798e-3f);
            p = MyFma(p, t, -2.64646143e-1f);
            p = MyFma(p, t, 8.40016484e-1f);
        }
        else
        {
            p = 5.43877832e-9f;
            p = MyFma(p, t, 1.43285448e-7f);
            p = MyFma(p, t, 1.22774793e-6f);
            p = MyFma(p, t, 1.12963626e-7f);
            p = MyFma(p, t, -5.61530760e-5f);
            p = MyFma(p, t, -1.47697632e-4f);
            p = MyFma(p, t, 2.31468678e-3f);
            p = MyFma(p, t, 1.15392581e-2f);
            p = MyFma(p, t, -2.32015476e-1f);
            p = MyFma(p, t, 8.86226892e-1f);
        }
        r = a * p;
        return r;
    }
    private float MyFma(float x, float y, float z)
    {
        return x * y + z;
    }
    private float MyLog(float a)
    {
        float i, m, r, s, t;
        int e = 0;
        m = Frexpf(a, ref e);

        if (m < 0.666666667f)
        {
            m += m;
            e -= 1;
        }
        i = e;
        m -= 1.0f;
        s = m * m;
        r = -0.130310059f;
        t = 0.140869141f;
        r = MyFma(r, s, -0.121484190f);
        t = MyFma(t, s, 0.139814854f);
        r = MyFma(r, s, -0.166846052f);
        t = MyFma(t, s, 0.200120345f);
        r = MyFma(r, s, -0.249996200f);
        r = MyFma(t, m, r);
        r = MyFma(r, m, 0.333331972f);
        r = MyFma(r, m, -0.500000000f);
        r = MyFma(r, s, m);
        r = MyFma(i, 0.693147182f, r);
        return r;
    }
    private float Frexpf(float x, ref int exp)
    {
        exp = 0;
        if (x == 0f) return 0f;

        float abs_x = Mathf.Abs(x);
        if (abs_x == float.PositiveInfinity || float.IsNaN(abs_x)){
            return x;
        }
        exp = (int)Mathf.Floor(Mathf.Log(abs_x, 2)) + 1;
        float significand = x * Mathf.Pow(2, -exp);
        if (Mathf.Abs(significand) >= 1f)
        {
            significand *= 0.5f;
            exp++;
        }
        else if (Mathf.Abs(significand) < 0.5f && significand != 0f)
        {
            significand *= 2f;
            exp--;
        }
        return significand;
    }
}
//随机生成 1000000 条数据
//以下单位(条)
百分之0 30440 
百分之1 30281 
百分之2 30270 
百分之3 30300 
百分之4 29800 
百分之5 29556 
百分之6 29309 
百分之7 28959 
百分之8 28904 
百分之9 28092 
百分之10 28140 
百分之11 27562 
百分之12 27298 
百分之13 26807 
百分之14 26273 
百分之15 25309 
百分之16 24687 
百分之17 24489 
百分之18 23420 
百分之19 23120 
百分之20 22205 
百分之21 21822 
百分之22 20976 
百分之23 20383 
百分之24 19481 
百分之25 19044 
百分之26 18296 
百分之27 17704 
百分之28 16825 
百分之29 16214 
百分之30 15624 
百分之31 14886 
百分之32 13952 
百分之33 13736 
百分之34 12764 
百分之35 12318 
百分之36 11692 
百分之37 10826 
百分之38 10348 
百分之39 9772 
百分之40 9130 
百分之41 8825 
百分之42 8235 
百分之43 7780 
百分之44 7179 
百分之45 6810 
百分之46 6398 
百分之47 5949 
百分之48 5318 
百分之49 5198 
百分之50 4671 
百分之51 4626 
百分之52 4023 
百分之53 3883 
百分之54 3351 
百分之55 3414 
百分之56 3003 
百分之57 2794 
百分之58 2637 
百分之59 2211 
百分之60 2303 
百分之61 2023 
百分之62 1715 
百分之63 1627 
百分之64 1640 
百分之65 1367 
百分之66 1166 
百分之67 1215 
百分之68 1008 
百分之69 762 
百分之70 996 
百分之71 635 
百分之72 822 
百分之73 608 
百分之74 583 
百分之75 397 
百分之76 407 
百分之77 391 
百分之78 386 
百分之79 405 
百分之80 192 
百分之81 209 
百分之82 226 
百分之83 205 
百分之84 210 
百分之85 201 
百分之86 206 
百分之87 0 
百分之88 184 
百分之89 0 
百分之90 207 
百分之91 0 
百分之92 0 
百分之93 194 
百分之94 0 
百分之95 0 
百分之96 0 
百分之97 191 
百分之98 0 
百分之99 0 

图像来源GPT-4

文章借鉴&引用:

Inverse Error Function in C - Stack Overflow

关于C#:精确计算比例互补误差函数erfcx() | 码农家园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1718981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jmeter性能测试-【关联,提取器】

新知识点 关联&#xff1a; 正则表达式提取器 边界提取器 XPath提取器 JSON提取器 梳理框架 1. Jmeter基础 定义&#xff1a;Jmeter是一个开源的性能测试工具&#xff0c;主要用于Web应用和各种服务的性能测试。 主要功能&#xff1a;可以模拟多用户并发访问&#xff0c;测…

【Python】解决Python报错:AttributeError: ‘str‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

计算机网络-BGP状态机制与对等体表项

前面我们讲了BGP交互后需要建立对等体&#xff0c;BGP存在两种对等体关系类型&#xff1a;EBGP及IBGP&#xff0c;那对等体建立过程的状态是怎样的呢&#xff1f;BGP报文我们也学习过了&#xff0c;现在通过结合起来了解下BGP的状态机以及对等体表。 一、BGP状态机 也就是两台路…

数据库设计:实体关系图

一个良好的设计对于数据库系统至关重要&#xff0c;它可以减少数据冗余&#xff0c;确保数据的一致性和完整性&#xff0c;同时使得数据库易于维护和扩展。 实体关系图&#xff08;Entity-Relationship Diagram、ERD&#xff09;是一种用于数据库设计的结构图&#xff0c;它描…

【再探】设计模式—中介者模式、观察者模式及模板方法模式

中介者模式让多对多的复杂引用关系变成一对多&#xff0c;同时能通过中间类来封装多个类中的行为&#xff0c;观察者模式在目标状态更新时能自动通知给订阅者&#xff0c;模版方法模式则是控制方法的执行顺序&#xff0c;子类在不改变算法的结构基础上可以扩展功能实现。 1 中…

ESP8266使用AT指令登陆新版OneNET平台进行固定数据上报

登陆OneNET进开发者中心 创建产品 创建云平台产品 产品类别和智能化方式选择 产品名称和城市自定义选择&#xff0c;框选部分参照下图&#xff0c;开发方案选标准方案时平台会预置标准物模型和App控制面板&#xff0c;选自定义方案用户可自行定义物模型和App控制面板&…

RedisTemplate实战应用--队列等

一、RedisTemplate队列插入 1、从集合左边插入值 https://blog.csdn.net/weixin_43658899/article/details/121040307 leftPush(K key, V value) redisTemplate.opsForList().leftPush("leftdatakey","bbbb");2、从集合左边开始在v1值后边插入新值v2 le…

忘记论文Word文档密码,如何找回加密密码

论文的撰写与保存是每位学者都需面对的重要任务。为了保护自己的劳动成果&#xff0c;许多学者会选择对Word文档进行加密&#xff0c;设置密码以确保文档的安全。然而&#xff0c;有时我们可能会因为各种原因忘记了文档密码&#xff0c;这无疑会给我们的工作带来诸多不便。那么…

跨境电商如何有效做好店铺账号管理?

跨境电商有效做好店铺账号管理至关重要&#xff0c;类似亚马逊、Temu、TikTok、ebay跨境电商账号涉及多个方面&#xff0c;包括多个账户的安全性、合规性、操作效率等。以下是一些我自己实操的策略和实践&#xff0c;希望能够帮助大家更好地管理跨境电商店铺账号。 一、哪些行为…

sqlite--SQL语句进阶

SQL语句进阶 函数和聚合 函数&#xff1a; SQL 语句支持利用函数来处理数据&#xff0c; 函数一般是在数据上执行的&#xff0c; 它给数据的转换和处理提供了方便常用的文本处理函数&#xff1a; 常用的文本处理函数&#xff1a; // 返回字符串的长度 length();//将字符串…

QWidget成员函数功能和使用详细说明(二)(文字+用例+代码+效果图)

文章目录 1.测试工程配置2.成员函数2.1 void setFixedHeight(int h)2.2 void setFixedSize(const QSize &s)2.3 void setFixedSize(int w, int h)2.4 void setFixedWidth(int w)2.5 void setFocus(Qt::FocusReason reason)2.6 void setFocusPolicy(Qt::FocusPolicy policy)…

【LeetCode算法】第101题:对称二叉树

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;递归判定左子树和右子树是否对称。用一个新函数sym来递归判定左子树和右子树是否对称。该函数细节&#xff1a;判定当前传入的两个根节点是否为空&#xff0c;若均为空…

移动电商服务器单点部署

知识图谱 任务一&#xff1a;Web服务器部署 1.知识结构 2.WEB服务器的介绍 Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上提供某种特定类型计算机的程序&#xff0c;Web服务器可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件&#xff0c;让全世界…

23种软件设计模式——工厂模式

工厂模式 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 通过使…

laravel项目配置Facades Redis自动补全,方法查看

问题原因: 因为Laravel的Redis连接实例是通过RedisManger的工厂类创建的,返回的是一个mixin的类型,因此在IDE中不能自动补全Redis的方法,缺少这个功能,使用起来有些麻烦,尤其是Redis有数十个方法,每个方法也有不少参数。 相关部分的代码如下: /*** @mixin \Illumina…

【Python】解决Python报错:AttributeError: ‘generator‘ object has no attribute ‘xxx‘

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

python weakref的应用举例

问题: 有很多时候, 我们想拥有一个实例, 但是不增加引用计数. 怎么解决呢? 场景: 英雄击打怪物, 如果怪物在受到英雄打击前就死了, 我们可以在英雄的实例里面, 使用一个弱引用来引用怪物, 如果还存在就击打, 不存在就不击打.一般的ui系统都有事件系统, ui上触发一个事件, 然…

TCP协议详解及其相关的10个核心机制(面试重点)

TCP协议的报文格式 TCP协议有连接&#xff0c;可靠性传输&#xff0c;面向字节流&#xff0c;全双工。 他的数据格式如图&#xff1a; 根据他的数据格式&#xff0c;在这里我们只知道 16位源端口号&#xff08;表示客户端这里的端口号&#xff09;&#xff0c;16位目的端口号&…

Maven 中的 classifier 属性用过没?

最近训练营有小伙伴问到松哥一个关于 Maven 依赖的问题&#xff0c;涉及到 classifier 属性&#xff0c;随机问了几个小伙伴&#xff0c;都说工作中没用到过&#xff0c;因此简单整篇文章和小伙伴们分享下。 Maven 大家日常开发应该都有使用&#xff0c;Maven 中有一个比较好玩…

读:《An Overview of Diffusion Models Applications……》导览

读&#xff1a;《An Overview of Diffusion Models: Applications,Guided Generation, Statistical Rates and Optimization》 简单说明 这篇文章也是关于 Diffusion 模型的综述&#xff0c;但是这一篇讲的显然不如 2022出的这篇综述 [2209.00796] Diffusion Models: A Compreh…