【问题标题】:What is the function behind srand? [closed]srand 背后的功能是什么? [关闭]
【发布时间】:2014-07-21 22:59:05
【问题描述】:

我知道这是一个奇怪的问题,但我真的很想知道 srand() 函数的背后是什么,只是出于好奇。是否可以编写具有相同目的的 C 代码,或者它是否依赖于机器本身?感谢您的帮助。经验

【问题讨论】:

标签: c random srand


【解决方案1】:

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 函数的 实现;这只是标准提供的一种可能的实现方式。

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

如需更多信息,请参阅优秀的comp.lang.c FAQ,尤其是问题 13.15 至 13.21。

【讨论】:

  • 我明白了,谢谢。我知道这是一个函数,但我不知道它背后的代码是什么(仍然不完全理解它,但现在 XP 更清楚了)再次感谢您的回答。
【解决方案2】:

rand 的要求是:

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

该标准没有定义任何方法来恢复内部状态以进行重新播种或其他任何操作。

对于实现什么 PRNG 没有要求,因此每个实现都可以有自己的,尽管 Linear Congruential Generators 是最受欢迎的。

这里展示了一个符合标准(尽管可以说是无用的)实现:

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

【讨论】:

    【解决方案3】:

    当然。 srand()rand() 写成 C。还有什么?!

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

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

    abm 是常量。 srand(val) 建立X 的初始值。每次调用rand(),它都会执行上面的计算并返回X 的新值。

    【讨论】:

      猜你喜欢
      • 2019-10-11
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多