【发布时间】:2014-07-21 22:59:05
【问题描述】:
我知道这是一个奇怪的问题,但我真的很想知道 srand() 函数的背后是什么,只是出于好奇。是否可以编写具有相同目的的 C 代码,或者它是否依赖于机器本身?感谢您的帮助。经验
【问题讨论】:
-
在幕后,基本上有一个种子和一个伪随机生成器函数。见en.wikipedia.org/wiki/Pseudorandom_generator
我知道这是一个奇怪的问题,但我真的很想知道 srand() 函数的背后是什么,只是出于好奇。是否可以编写具有相同目的的 C 代码,或者它是否依赖于机器本身?感谢您的帮助。经验
【问题讨论】:
srand()是一个函数。
其实现细节可能因一种实现而异,但 ISO C 标准提供了srand 和rand 的示例实现。请参阅N1570 第 7.22.3 节:
static unsigned long int next = 1;
// RAND_MAX assumed to be 32767
int rand(void)
{
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}
void srand(unsigned int seed)
{
next = seed;
}
请务必注意,这绝不是rand 和srand 函数的 实现;这只是标准提供的一种可能的实现方式。
请注意,对于传递给srand() 的给定种子,调用rand() 产生的“随机”(实际上是伪随机)数字序列是固定的。这是故意的;它允许您通过使用相同的种子来重现程序的相同行为。这些函数通常不适合需要高质量伪随机数的应用程序。
如需更多信息,请参阅优秀的comp.lang.c FAQ,尤其是问题 13.15 至 13.21。
【讨论】:
rand 的要求是:
RAND_MAX(最小值为 32767)。srand() 设置的种子决定了返回的伪随机数序列。该标准没有定义任何方法来恢复内部状态以进行重新播种或其他任何操作。
对于实现什么 PRNG 没有要求,因此每个实现都可以有自己的,尽管 Linear Congruential Generators 是最受欢迎的。
这里展示了一个符合标准(尽管可以说是无用的)实现:
【讨论】:
当然。 srand() 和 rand() 写成 C。还有什么?!
他们使用线性同余伪随机数生成器的简单想法:
X <- (a * X + b) mod m
值a、b 和m 是常量。 srand(val) 建立X 的初始值。每次调用rand(),它都会执行上面的计算并返回X 的新值。
【讨论】: