【发布时间】:2012-01-24 01:01:24
【问题描述】:
我说的是 this 从 C 标准中对 rand() 的简单实现:
static unsigned long int next = 1;
int rand(void) /* RAND_MAX assumed to be 32767. */
{
next = next * 1103515245 + 12345;
return (unsigned)(next/65536) % 32768;
}
从this Wikipedia article我们知道乘数a(在上面的代码a = 1103515245)应该只满足两个条件:
-
a - 1可以被m的所有质因数整除。
(在我们的例子中m = 2^32是 int 的大小,所以m只有一个素因子 = 2) -
如果
m是 4 的倍数,a - 1是 4 的倍数。
(32768 是 4 的倍数,1103515244 也是)
为什么他们选择了这样一个奇怪的、难以记住的“伙计,我受够了这些随机数字,随便写”数字,比如 1103515245?
也许有一些明智的理由,这个数字比另一个更好?
例如,为什么不设置a = 20000000001?它更大、更酷、更容易记住。
【问题讨论】:
-
@Ed S.:足够合理的问题可以要求解释一个神奇的数字......
-
:) 当然不是,但是看看数字 12345。一旦他们选择了简单、好看的数字 12345,一旦选择了不好的……没有理由? :)
-
您可以先查看参考资料,答案可能就在某处:en.wikipedia.org/wiki/Linear_congruential_generator#References
-
这很有趣。我没有解决方案,但可能与
65536是可以存储在两个字节上的最大 int 有关。 -
@Edwin: 通常
65536是不能存储在 2 个字节上的最小 int ;)