逻辑

2012-10-14 110 views
2

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

如何C编译器是否需要应在随机数生成函数接下来将生成的数字决定?例如,它总是在给定范围内生成一个新的随机数。这是如何完成的?

+0

我注意到的问题是每次运行程序时都会产生相同的随机数序列。因此,种子进来。 – SparKot

+0

阅读此:[随机数生成器在C](http://stackoverflow.com/questions/12885171/logic-behind-the-random-number-generator-in-c) –

回答

1

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

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

    X n + 1个 < - AX Ñ + C(mod M)表示

于是从PRNG每个新样品通过先前采样书确定,以及常数a,c和m。请注意,a,c和m的选择至关重要,如讨论here

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

1

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

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

正如你所看到的,这个方法可以让你预测该系列中的下一个号码,如果你知道前面数。有更复杂的方法。

各种类型的伪随机数发生器已被设计用于特定目的。有一些安全的PRNGs很慢但很难预测,即使你知道它们是如何工作的,也有像Mersenne Twister这样的大型PRNG,它们具有很好的分布特性,因此可用于编写蒙特卡洛模拟。作为一个经验法则,一个线性同余发生器足够用于编写一个游戏(怪物交易造成多少伤害),但对编写一个模拟程序来说还不够好。有许多研究人员选择贫穷的PRNG作为他们的项目的丰富的历史;他们的模拟结果是可疑的结果。

0

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

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