2012-01-27 121 views
1

这个问题是不是关于如何使用任何语言在任何间隔之间生成一个随机数。它是关于产生0或1。PC/Mac如何为0或1生成随机数?

据我所知,许多随机发生器算法操纵非常基本随机的(0或1)的功能和从用户采取种子和使用算法根据需要产生各种随机数。

的问题是,CPU即如何产生0或1?如果我投掷一枚硬币,我可以产生头部或尾部。那是因为我身体投掷硬币并让自然决定。但CPU如何做呢?必须有动作 CPU(像投掷硬币一样)随机获得0或1,对吗?

有人能告诉我吗?

感谢

回答

1

(这有几个方面,因此一些算法。请记住,有许多不同的形式用于不同目的的随机性,但我明白,你有兴趣在实际的方式你的问题用于密码的随机性。)

这里的根本问题是,电脑是(主要)确定性的机器。如果在相同的状态下输入相同的数据,他们总会得到相同的结果。但是,有几种实际收集熵的方法:

  1. 用户输入。由于用户将外部输入带入系统,您可以从中获取一些位。类似于你如何使用放射性衰减或线路噪声。
  2. 网络活动。再次,外部来源的东西。
  3. 通常中断(包括前两个)。
  4. 正如第一项中提到的那样,可以使用来自外围设备的噪音,例如音频输入或摄像头。
  5. 有专用硬件可以产生每秒几百M的随机性。尽管如此,他们通常直接给你随机数,而不是内部熵。

你到底如何从中导出位是你的,但你可以使用事件,或从事件等实际内容之间的时间 - 通常从熵源消除偏见是不容易的或微不足道,很多的思想和算法工作进入了这个过程(在上述特殊硬件的情况下,这全部用硬件完成,使用它的代码不需要关心它)。

一旦你真正随机比特池你可以用它们作为随机数(/dev/random在Linux确实是)。但是这有缺点,因为实际的熵通常很小,并且对随机数的需求可能更高。所以,你可以发明的算法“拉伸”,在一个方式,使得它仍然不可能或者至少很难预测约下面的数字(/dev/urandom在Linux或两个/dev/random/dev/urandom在FreeBSD上做的)任何初始随机性。 FortunaYarrow是所谓加密安全伪随机数发生器和设计考虑到这一点。你仍然对你产生的随机数的质量有很好的保证,但在你的熵池用完之前还有很多。

在任何情况下,CPU本身不能给你一个0或1的随机数。涉及更多,这通常包括完整的计算机系统或专门为此目的而构建的硬件。


还有一个第二级的计算随机性:普通香草伪随机数生成器(PRNG)。我之前说过的决定论 - 这是它的体现。给定相同的所谓的种子 PRNG将每次产生完全相同的数字序列1。虽然这听起来很愚蠢,但它有实际的好处。

假设您运行了一个涉及大量随机数的模拟,可能模拟分子或原子之间的相互作用,这涉及到某些概率和不可预知的行为。在科学中,你需要任何人都可以独立验证的结果,给定相同的设置和程序(或者使用相同的算法)。如果你使用了实际的随机性,你唯一的选择就是保存每一个随机数,以确保其他人可以独立地复制结果。

但是使用PRNG,您只需保存种子并记住您使用的算法。其他人则可以独立得到完全相同的伪随机数序列。很不错的属性,使其具有:-)


脚注

¹这甚至包括上面提到的CSPRNGs,但它们被设计在包括定期重新播种熵一种特殊的方式来使用克服这个问题。

+0

感谢您的回答。所以你的意思是实际上CPU本身没有或者不能真正产生一个0或1的随机数。相反,无论如何,CPU需要一些外部因素来帮助随机生成0或1。 – 2012-01-27 13:10:23

+0

确实。我想我现在只是用我的编辑添加了这句话。 – Joey 2012-01-27 13:13:43

+0

非常明确,谢谢 – 2012-01-27 13:38:09

0

一个CPU只能产生一个统一的随机数U(0,1),其范围从0到1.所以在数学上它将被定义为一个随机变量U,范围在[0,1] 。在0到1范围内的U(0,1)随机数的随机抽取的示例将是0.28100002,0.34522,0.7921等。在0和1之间的任何值的概率是相等的,即它们是等概率的。

如果U(0,1)< = 0.5,则将U(0,1)的随机绘图设置为0,如果U(0,1)为1,则可以生成0或1的二元随机变量。 > 0.5,因为从理论上讲,U(0,1)随机抽取的次数会低于0.5并且高于0.5。