C语言中随机数发生器背后的逻辑

C语言中随机数发生器背后的逻辑,c,C,可能重复: C编译器如何决定是否在随机数生成函数中生成下一个数字?例如,它总是在给定范围内生成一个新的随机数。如何做到这一点?这取决于所讨论的伪随机数生成器PRNG的具体实现。使用的变体很多 一个常见的例子是LCG系列。它们由递归关系定义: Xn+1这取决于所讨论的伪随机数生成器PRNG的具体实现。使用的变体很多 一个常见的例子是LCG系列。它们由递归关系定义: Xn+1它通过保持某些状态并在每次调用函数时修改状态来生成下一个数字。这种函数称为伪随机数生成器。创建PRNG的旧方法是线性同余生成

可能重复:


C编译器如何决定是否在随机数生成函数中生成下一个数字?例如,它总是在给定范围内生成一个新的随机数。如何做到这一点?

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

一个常见的例子是LCG系列。它们由递归关系定义:


Xn+1这取决于所讨论的伪随机数生成器PRNG的具体实现。使用的变体很多

一个常见的例子是LCG系列。它们由递归关系定义:


Xn+1它通过保持某些状态并在每次调用函数时修改状态来生成下一个数字。这种函数称为伪随机数生成器。创建PRNG的旧方法是线性同余生成器,它非常简单:

static int rand_state;
int rand(void)
{
    rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
    return rand_state;
}
如您所见,如果您知道前一个数字,此方法允许您预测序列中的下一个数字。还有更复杂的方法

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


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

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

static int rand_state;
int rand(void)
{
    rand_state = (rand_state * 1103515245 + 12345) & 0x7fffffff;
    return rand_state;
}
如您所见,如果您知道前一个数字,此方法允许您预测序列中的下一个数字。还有更复杂的方法

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


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

这不是一个编译器,而是一个C库,它有一个函数来产生伪随机而不是真正的随机!数字


通常用于此目的。

它不是一个编译器,而是一个C库,具有生成伪随机而不是真正随机的函数!数字


通常用于此目的。

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


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


在stackoverflow中有很多关于这方面的问题。这里有几个。你可以从这些人那里得到帮助


在stackoverflow中有很多关于这方面的问题。这里有几个。你可以从这些人那里得到帮助


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

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

随机数生成是在运行时而不是编译时完成的。 提供随机性的策略取决于或应该很大程度上取决于appl 反腐败。例如,如果您只需要在给定范围内均匀分布的值序列,则可以使用诸如线性同余生成器之类的解决方案。如果您的应用程序与安全性/密码学相关,那么您需要更强大的属性,即您的值是随机分布的,并且也是不可预测的。 一个主要的挑战是获得真正的随机性,你可以用它来种子你的伪随机发生器,它将真正的随机性扩展成任意数量的可用随机性。一种常见的技术是使用一些不可预测的系统状态,例如,对鼠标位置或按键计时进行采样,然后使用伪随机生成器为整个系统提供随机性。
我注意到的问题是,每次运行程序时,都会生成相同的随机数序列。因此,种子就出现了。请阅读:我注意到的问题是,每次运行程序时,都会生成相同的随机数序列。因此,种子就出现了。请阅读以下内容: