我知道这是一个奇怪的问题,但我真的想知道srand()函数的背后是什么,仅仅是出于纯粹的好奇心。是否可以编写具有相同结束或依赖于机器本身的C代码?谢谢您的帮助。 XP
答案 0 :(得分:5)
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
函数的 实现;它只是一种可能的实现,由标准作为示例提供。
请注意,对于传递给rand()
的给定种子,对srand()
的调用产生的“随机”(实际上是伪随机)数字序列是固定的。这是故意的;它允许您使用相同的种子为程序重现相同的行为。这些功能通常不适用于需要高质量伪随机数的应用。
有关详细信息,请参阅优秀comp.lang.c FAQ,尤其是问题13.15至13.21。
答案 1 :(得分:1)
rand
的要求是:
RAND_MAX
(最小值32767)。srand()
设置的种子确定返回的伪随机数序列。标准没有定义任何方法来恢复重播或其他任何内部状态。
对PRNG的实施没有要求,因此每个实现都有自己的实现,但Linear Congruential Generators是最受欢迎的。
这里提出了一个符合(虽然可以说是无用的)实现:
答案 2 :(得分:0)
当然。 srand()
和rand()
写的是C.还有什么?!
他们使用线性同余伪随机数生成器的简单概念:
X <- (a * X + b) mod m
值a
,b
和m
是常量。 srand(val)
确定X
的初始值。每次拨打rand()
时,它都会执行上述计算并返回X
的新值。