C中随机数生成器背后的逻辑

时间:2012-10-14 18:24:05

标签: c

  

可能重复:
  How does a random number generator work?

C编译器如何决定在随机数生成函数中接下来应该生成哪个数字?例如,它始终在给定范围之间生成新的随机数。怎么做的?

6 个答案:

答案 0 :(得分:1)

这取决于所讨论的伪随机数发生器(PRNG)的具体实现。使用中有很多变种。

一个常见的例子是linear congruential generators(LCG)的家族。这些由递归关系定义:

X n + 1 < -aX n + c(mod m)

因此,来自PRNG的每个新样本仅由前一个样本和常数a,c和m确定。请注意,a,c和m的选择至关重要,如here所述。

LCG非常简单有效。它们通常用于标准库提供的随机数生成器。然而,它们具有较差的统计特性,并且为了更好的随机性,更优先的是更先进的PRNG。

答案 1 :(得分:1)

每次调用函数时,它会通过保持某个状态并修改状态来生成下一个数字。这样的函数称为伪随机数生成器。创建PRNG的一种旧方法是线性同余生成器,这很容易:

static int rand_state;
int rand(void)
{
    rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
    return rand_state;
}

如您所见,如果您知道之前的数字,此方法可让您预测系列中的下一个数字。有更复杂的方法。

为特定目的设计了各种类型的伪随机数发生器。即使你知道它们是如何工作的,也有安全的PRNG很慢但难以预测,并且有像Mersenne Twister这样的大型PRNG具有良好的分布特性,因此可用于编写蒙特卡罗模拟。

根据经验,线性同余生成器足以编写游戏(怪物会造成多大的伤害),但不足以编写模拟。有一个丰富多彩的历史,研究人员为他们的项目选择了差的PRNGs;结果他们的模拟结果很可疑。

答案 2 :(得分:1)

它不是编译器而是具有生成伪随机(非真正随机!)数字的函数的C库。

通常使用linear congruential generators

答案 3 :(得分:1)

好吧,C编译器不接受这个决定。下一个随机数取决于算法。生成随机数并非易事。看看

答案 4 :(得分:0)

stackoverflow中有很多关于此的问题。这里有几个。你可以从中获得帮助。

implementation of rand()

Rand function in c

Rand Implementation

答案 5 :(得分:0)

这实际上是一个非常大的话题。一些关键的事情:

  • 随机数生成是在运行时完成的,而不是在编译时完成的。
  • 提供随机性的策略在很大程度上取决于(或应该取决于)应用程序。例如,如果您只需要在给定范围内均匀分布的一系列值,则使用诸如线性同余生成器之类的解决方案。如果您的应用程序与安全/加密相关,那么您将需要更强大的属性,即您的值随机分布并且也是不可预测的。
  • 一个主要挑战是获取“真实”随机性,您可以使用它来为您的伪随机生成器播种(将“实际随机性”“拉伸”为任意数量的可用随机性)。一种常见的技术是使用一些不可预测的系统状态(例如,采样鼠标的位置或按键时序),然后使用伪随机生成器为整个系统提供随机性。