我必须在汇编程序上编写伪随机生成器,而不使用任何float / double操作和函数,例如sin / cos,sqrt e.t.c.所以我不能使用一般方法来做到这一点。我也有随机数限制: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 **
答案 0 :(得分:3)
使用linear feedback shift register。所有整数计算,您可以剥离单个字节以返回随机数。
该页面只是一个特别容易接近的例子。有很多东西可以讨论使用LFSR生成伪随机数。
答案 1 :(得分:2)
假设[0,15]中整数的“高斯”分布意味着binomial distribution B(15,1 / 2),显而易见的方法是生成两个随机字节,用{掩盖第二个字节} {1}},并计算设置的位数。三位版本看起来像这样。
0x7f
如果此假设不正确,请编辑您的问题以指定[0,15]中每个整数所需的确切概率。
如果您的目标平台具有8位乘法和16位输出,则应该可以获得有效的Complementary-multiply-with-carry生成器,例如,b = 256且r = 256且a = 207,或b = 256且r = 32且a = 211.(我不确定您对发生器状态有多大空间,或者这些参数选择是否通过随机性测试。)