我今天听说C中的随机函数不是生成随机数的好方法。有人告诉我,可以预测产生的价值。
我问,因为我听到了一些有趣的事情:
基本上,如果您有输入参数,您将获得相同的结果。 我还听说过来自C的rand函数不返回随机值,而是伪随机值。这是什么意思?
答案 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
等操作系统编号生成器的工作方式。