繁体   English   中英

如何在没有浮点数/双数的情况下生成均匀和高斯分布的伪随机数?

[英]How generate pseudo-random numbers in uniform and gaussian distribution without float/double numbers?

我必须在汇编器上编写伪随机生成器,而没有任何float / double操作和函数,例如sin / cos,sqrt等,因此我不能使用常规方法来做到这一点。 我也对随机数有限制:00-0F。 我怎样才能做到这一点?

据我了解,我首先需要生成统一编号。 我这样做是这样的: x = (13 * x + 7) % 16; (但是有一个问题-它是有史以来最单一的分布。如果它生成15个数字并且我都知道它们,我可以100%的概率说16号,因为在16(模块)的周期中哪里没有重复)。

之后,我需要将这些数字重新生成为高斯。 我在互联网上找到了该解决方案,但是它不起作用。

for (i = 0; i < N; ++i) // N - amount of randomized numbers
{
    ++gx[x = (a * x + c) % m]; //gx - histogram of x
    xm[i] = x; // xm - massive of randomized numbers in uniform
    y = 0;      
    for (j = 0; j < i + 1; ++j)
    {
        y += xm[j] * n - j; // n - primitive number. I choose 13
    }
    y = y / (i + 1);
    y %= m;
    ym[i] = y; // ym - massive of randomized numbers in gaussian
    ++gy[y]; //gy - histogram of y
}

我该怎么办? (我对概率论一无所知)

我得到gx和gy的输出:

Uniform
0       4       ****
1       4       ****
2       4       ****
3       4       ****
4       4       ****
5       4       ****
6       4       ****
7       4       ****
8       4       ****
9       4       ****
10      4       ****
11      4       ****
12      4       ****
13      4       ****
14      4       ****
15      4       ****


Normal
0       2       **
1       3       ***
2       8       ********
3       4       ****
4       10      **********
5       4       ****
6       1       *
7       2       **
8       1       *
9       3       ***
10      8       ********
11      4       ****
12      5       *****
13      6       ******
14      1       *
15      2       **

使用线性反馈移位寄存器 所有整数计算,您可以剥离单个字节以返回您的随机数。

该页面只是一个特别容易处理的示例。 有很多关于使用LFSR生成伪随机数的内容。

假设[ 0,15 ]中的整数上的“高斯”分布表示二项式分布 B( 15,1 /2),显而易见的方法是生成两个随机字节,将第二个字节掩码0x7f并计数位设置。 三位版本看起来像这样。

0 *
1 *******
2 *********************
3 ***********************************
4 ***********************************
5 *********************
6 *******
7 *

如果此假设不正确,请编辑您的问题以指定[0,15]中每个整数所需的确切概率。

如果您的目标平台具有8位乘法和16位输出,那么应该有可能获得一个高效的带进位乘积发生器,例如b = 256和r = 256且a = 207,或者b = 256,r = 32,a =211。(我不确定您有多少空间用于生成器状态,或者这些参数选择是否通过随机性测试。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM