展位背后的功能是什么?

时间:2014-07-21 22:59:06

标签: c random srand

我知道这是一个奇怪的问题,但我真的想知道srand()函数的背后是什么,仅仅是出于纯粹的好奇心。是否可以编写具有相同结束或依赖于机器本身的C代码?谢谢您的帮助。 XP

3 个答案:

答案 0 :(得分:5)

srand() 是一个函数。

其实现的细节可能因实现而异,但ISO C标准提供了srandrand的示例实现。请参阅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;
}

重要的是要注意,这绝不是randsrand函数的 实现;它只是一种可能的实现,由标准作为示例提供。

请注意,对于传递给rand()的给定种子,对srand()的调用产生的“随机”(实际上是伪随机)数字序列是固定的。这是故意的;它允许您使用相同的种子为程序重现相同的行为。这些功能通常不适用于需要高质量伪随机数的应用。

有关详细信息,请参阅优秀comp.lang.c FAQ,尤其是问题13.15至13.21。

答案 1 :(得分:1)

rand的要求是:

  • 生成伪随机数。
  • 范围是0到RAND_MAX(最小值32767)。
  • srand()设置的种子确定返回的伪随机数序列。
  • 它不需要是线程安全的,甚至不是可重入的,状态可以存储在静态变量中。

标准没有定义任何方法来恢复重播或其他任何内部状态。

对PRNG的实施没有要求,因此每个实现都有自己的实现,但Linear Congruential Generators是最受欢迎的。

这里提出了一个符合(虽然可以说是无用的)实现:

enter image description here

摘自我之前的回答:https://stackoverflow.com/a/24005617/3204551

答案 2 :(得分:0)

当然。 srand()rand()写的是C.还有什么?!

他们使用线性同余伪随机数生成器的简单概念:

X <- (a * X + b) mod m

abm是常量。 srand(val)确定X的初始值。每次拨打rand()时,它都会执行上述计算并返回X的新值。