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

Nex*_*xen 5 c c++ algorithm assembly

我必须在汇编程序上编写伪随机生成器,没有任何浮点/双操作和函数,如sin/cos,sqrt等.所以我不能使用通用方法来做到这一点.我也有随机数限制:00-0F.我怎样才能做到这一点?

据我所知,我首先需要生成统一数字.我这样做是这样的:x = (13 * x + 7) % 16;(但它有一个问题-这是有史以来的unifromest分布如果产生15个号码,我知道所有的人,我可以说,16日有100%的概率,因为那里是本期无重复是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
}
Run Code Online (Sandbox Code Playgroud)

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

我得到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       **
Run Code Online (Sandbox Code Playgroud)

Dav*_*tat 2

假设 [0, 15] 中的整数的“高斯”分布意味着二项分布B (15, 1/2),明显的方法是生成两个随机字节,用 掩码第二个字节0x7f,并计算位数放。三位版本看起来像这样。

0 *
1 *******
2 *********************
3 ***********************************
4 ***********************************
5 *********************
6 *******
7 *
Run Code Online (Sandbox Code Playgroud)

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

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