【问题标题】:rand function issues in C [duplicate]C中的rand函数问题[重复]
【发布时间】:2014-02-02 14:03:26
【问题描述】:

我今天听说 C 中的 random 函数不是生成随机数的好方法。有人告诉我,可以预测产生的价值。

我问是因为我听到了一些有趣的事情:

  1. 听说这个数字是根据CPU的时钟生成的
  2. 如果第一个为真,那么是否可以预测随机值?
  3. rand 函数是如何工作的,为什么不好?
  4. 嵌套在 C/C++ 中的其他编程语言的随机函数是否存在相同问题?

基本上,如果您有输入参数,您将获得相同的结果。 我还听说 C 中的 rand 函数不返回随机值,而是返回伪随机值。这是什么意思?

【问题讨论】:

  • rand 不是基于 CPU 的时钟。
  • 另外,您在发布此内容之前是否进行了任何研究?例如阅读en.wikipedia.org/wiki/Pseudorandom?
  • 在 C++(准确地说是 C++11)中,您可以使用 std::random_device,它依赖于操作系统熵池来产生强(即“不可预测”)随机数。但是,除非您的 PC 上附加了熵的物理源(即“随机性”),否则您获得的“随机”数始终是可以重现的计算结果,因此称为“伪随机”。这种计算可能非常难以重现,甚至在物理上无法重现,但它并不是真正意义上的“随机”。
  • 不幸的是,鉴于 OP 的“来自其他编程语言的函数......有相同的问题”问题,这个答案作为 2010 年问题的副本被关闭。 C++11 已经提出了这个问题,并且在“重复”帖子中没有表示。

标签: c random


【解决方案1】:

随机不是基于cpu时钟,但使用的种子可以基于当前时间。

工作原理

与计算机中发生的任何事情一样,计算的结果是确定性的,不可能是真正随机的。基本上,随机函数会记住最新的返回值,并从旧的开始计算新的,例如:

X(i) = (a*X(i-1) + b)mod(n)   where a, b and n are constants

所以一个(伪)随机函数实际上根据第一个值返回一个可预测的数字序列。在 C 中,您可以使用 srand() 指定第一个值(种子):

srand(time(NULL));

例如,您可以通过这种方式将种子初始化为当前的秒数。但是如果你知道起始值,那么序列也是可以预测的。

问题

这不是很好的原因有很多,主要与安全性有关:例如,如果您有一个 Web 会话,由服务器在登录时提供给用户的随机数标识,并且攻击者能够预测它,这可以用来模拟真实用户。

通常与其他编程语言相同。获得更好的随机数的唯一方法是也依赖于用户给出的输入,例如鼠标移动、按键等。这使生成的值更加不可预测,这就是诸如/dev/random 之类的操作系统编号生成器的工作方式。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2010-11-14
    • 2012-02-05
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2014-11-05
    相关资源
    最近更新 更多