特殊的简单随机数生成器
如何创建一个函数,该函数在每次调用时都会生成一个随机整数?此数字必须尽可能是最大随机数(根据均匀分布)。它仅允许使用一个静态变量和至多3元步骤,其中每个步骤仅由一个基本的算术运算的元数
1或2。
例:
int myrandom(void){ static int x;
x = some_step1;
x = some_step2;
x = some_step3;
return x;
}
基本的算术运算是+,-,%和非,或,或,左移,右移,乘法和除法。当然,不允许使用rand(),random()或类似内容。
回答:
线性同余生成器是最古老,最简单的方法之一:
int seed = 123456789;int rand()
{
seed = (a * seed + c) % m;
return seed;
}
您只需要几条基本的算术指令即可。
为了保证该序列的最大可能周期, c 和 m 应该是互质的, a − 1应该可以被 m 的所有素数整除,如果 m 被4 整除,则 a
− 1应该可以整除。
参数的一些示例在Wikipedia上显示:例如,对于某些编译器,ANSI
C提出 m = 2³¹ , a = 1103515245和 c = 12345。
以上是 特殊的简单随机数生成器 的全部内容, 来源链接: utcz.com/qa/412887.html