如何使用一些随机和伪随机生成真实随机数

我正在(使用 Java)做一个非常基本的模拟器(队列系统。),它需要大量随机数(超过 $10^5$)。

我知道 Java Random 类肯定会给我我需要的所有随机数,并且它们通过了我正在做的所有考试,但是。 它们是伪随机的! 我不喜欢它。

我知道 随机数网站 给出了真的来自大气噪声(或类似的东西)的随机数,但它限制了下载。 具体来说,您不能通过一个 HTTP 请求下载超过 10000 个数字。

所以问题是:有没有办法用 $X$ 个随机数生成超过 $X$ 个随机数,而且是无限的( ) 伪随机?

7
2022-06-07 14:36:35
资源 分享
答案: 2

尽管如此,我认识到您的担忧:正如 Yuval 目前解释的那样,不能保证来自嘈杂的现实生活系统的数字对于您的应用程序来说比从伪随机数生成器创建的数字“更好”。

IID 随机变量是一种数学理想化。 稍微简化一下,对于每个实际的物理系统以及每个随机数生成器,都有一个分析测试将揭示生成的数字不是 IID。 “坏”随机数生成器是那些已经了解此类检查的随机数生成器,“好”随机数生成器是那些不了解此类检查的随机数生成器。 特别是,每个伪随机数生成器肯定会生成具有某种联系的数字。 问题是,如果创建的工件在您的应用程序使用它们时肯定会产生不正确的结果。 在这种感觉上,所有的随机数生成器都是“坏的”,但是对于某个应用,有些肯定会产生伪影,有些则肯定不会。 在技​​术上,通常无法确定哪些随机数算法会为所提供的应用程序产生伪像,哪些不会。 所以,我能给你的最有效的建议是

1) 使用通过通常统计测试的随机数生成器。 不要使用你不理解的实现。

有关随机数生成器的测试,请参见例如

CSIS

2) 使用至少两个不同的随机数生成器运行您的应用程序。

“不同”显然意味着各种算法,而不是例如两个不同的线性和声发生器。 这肯定会给你一个很大的可能性,即你得到的结果不是你的随机数生成器的产物。

一些文献:

  • William H. Press、Saul A. Teukolsky、William T. Vetterling、Brian P. Flannery:数值食谱,科学计算的艺术(第 3 版,第 7 章)

  • James E. Gentle:随机数生成以及蒙特卡洛方法(Springer,第 2 版)

4
2022-06-07 16:25:44
资源

绝对没有因素可以使用“真实”随机数。 此外,那些“真实的”随机数可能比伪随机数更糟糕。 例如,对于某些物理因素,“真实的”随机小比特可能会受到某种程度的操纵或具有较小的相关性。 这可以通过使用“随机抽取器”来解决,但是,为什么不直接使用相同的策略而没有所有问题呢?

肯定有一些因素不能满足伪随机性,但它们都不适用于您的情况。 例如,您不介意您的数字是确定性的。 你不在乎它们是否在密码学上是安全的。 你当然希望你所有的实验都是可重复的(尽管在你的“真实”设计下这仍然是可能的)。

关于您的最后一个具体问题,是的,可以利用外部“真实”随机位来影响产生随机数的密码设计。 您很可能可以在文学作品中找到一些方法(但不要尝试自己设计任何东西)。 请记住,不要专注于模拟本身,这会将您的注意力转移到在我看来完全是欺诈的事情上。

15
2022-06-07 15:04:34
资源