C中的rand函数问题

时间:2014-02-02 14:03:26

标签: c random

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

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

  1. 我听说这个数字是根据CPU的时钟生成的
  2. 如果第一个是真的,那么可以预测随机值吗?
  3. rand功能如何工作?为什么不好?
  4. 嵌套在C / C ++中的其他编程语言的随机函数是否存在同样的问题?
  5. 基本上,如果您有输入参数,您将获得相同的结果。 我还听说过来自C的rand函数不返回随机值,而是伪随机值。这是什么意思?

1 个答案:

答案 0 :(得分:0)

Random不是基于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等操作系统编号生成器的工作方式。

相关问题