如何获得真正的随机数?

  1. ‹ 更旧的帖子
  2. 3月前

    tyj518

    2楼 10月7日 优秀回答者
    3月前tyj518 重新编辑

    或许可以网上搜一下true random number generator,看有没有实验室或者机构可以实时在线提供随机数流。

    不差钱的话可以考虑买一个硬件的真随机数生成器。

  3. 这个 怎么样?

  4. @行人一棹天涯 这个 怎么样?

    这网站好厉害,还提供接口。非常感谢啦 /^^

  5. @tyj518 或许可以网上搜一下true random number generator,看有没有实验室或者机构可以实时在线提供随机数流。

    不差钱的话可以考虑买一个硬件的真随机数生成器。

    果然,要用英文搜才能搜到好结果

  6. 很好奇LZ要跑什么模拟,我之前也有要跑蒙卡一类的东西,感觉随机数生成机制方面的问题一般不会是主要的误差来源~ /><

  7. 3月前小时 删除了
  8. zhonglingshan1

    8楼 10月10日 化学版主, 技术版主

    用真随机数发生器产生随机数,然后把这个随机数作为伪随机数发生器的种子?

  9. @foozhencheng 很好奇LZ要跑什么模拟,我之前也有要跑蒙卡一类的东西,感觉随机数生成机制方面的问题一般不会是主要的误差来源~ /><

    不是蒙特卡罗 /:( 我这个需要10万*几百万个随机数,想想自己都不乐意干了

  10. @zhonglingshan1 用真随机数发生器产生随机数,然后把这个随机数作为伪随机数发生器的种子?

    既然得到真随机数了,还用作伪随机数种子 /o0 感觉在浪费时间

  11. @ShongLee 不是蒙特卡罗 /:( 我这个需要10万*几百万个随机数,想想自己都不乐意干了

    虽然还是不明白为什么你一定要真随机数,不过我之前也有生成1e8这个量级数量的随机数做模拟的,用伪随机数生成器就可以,而且保留随机数生成的种子还能保证结果有可复现性。

  12. 3月前小时 重新编辑

    @ShongLee 可以参考 numerical recipes 的 random numbers 章节。里面给出的最好的伪随机数生成器只有十多行代码,周期是 3.13e57,这个算法曾经有一个 1000 刀的奖金奖给从统计规律发现生成的随机数并不完全随机的人,结果无人获奖(现在奖励已经取消了)。这章给出的建议是 Never use the built-in generators in the C and C++ languages(估计 fortran 版也是这么说 fortran 的)。 所以我十分怀疑这个算法不能满足你的需求。

    05CCE7F8-CD68-4295-A2F5-607A0FB48C55.png
    0DA391F4-BB88-45B2-BD6A-2DD9884837EF.png

  13. @小时 @ShongLee 可以参考 numerical recipes 的 random numbers 章节。里面给出的最好的伪随机数生成器只有十多行代码,周期是 3.13e57,这个算法曾经有一个 1000 刀的奖金奖给从统计规律发现生成的随机数并不完全随机的人,结果无人获奖(现在奖励已经取消了)。这章给出的建议是 Never use the built-in generators in the C and C++ languages(估计 fortran 版也是这么说 fortran 的)。 所以我十分怀疑这个算法不能满足你的需求。

    05CCE7F8-CD68-4295-A2F5-607A0FB48C55.png
    0DA391F4-BB88-45B2-BD6A-2DD9884837EF.png

    我突然想起那个什么复杂度(名字记不住),可以用来衡量序列的随机性,主要思想是“能生成该序列的最短图灵机程序的长度就是这个序列的复杂度”(看到定义或许你知道我说的是什么复杂度)。所以就算伪随机序列周期很大,而代码很短,这不能保证序列的随机性好。这个也可以这样理解,代码越短,包含的信息量越少,产生的序列无论多长,该序列的“信息量”也不可能超越原代码的信息量。

  14. 3月前小时 重新编辑

    @ShongLee 我突然想起那个什么复杂度(名字记不住),可以用来衡量序列的随机性,主要思想是“能生成该序列的最短图灵机程序的长度就是这个序列的复杂度”(看到定义或许你知道我说的是什么复杂度)。所以就算伪随机序列周期很大,而代码很短,这不能保证序列的随机性好。这个也可以这样理解,代码越短,包含的信息量越少,产生的序列无论多长,该序列的“信息量”也不可能超越原代码的信息量。

    我劝你还是先试试吧。毕竟这书是数值计算的经典名著, 上面的代码也被检验了几十年了。 不要拿太理论的东西吓唬自己。理论上,足够多个猴子足够长的时间随机敲键盘还能打出莎士比亚的著作呢。

  15. @小时 我劝你还是先试试吧。毕竟这书是数值计算的经典名著, 上面的代码也被检验了几十年了。 不要拿太理论的东西吓唬自己。理论上,足够多个猴子足够长的时间随机敲键盘还能打出莎士比亚的著作呢。

    你说得有道理,初始实验可以使用这个伪随机序列。不过最后要得到令人信服的结果的话,就必须通过各种不同的伪随机算法产生相同的实验结果了。不然的话可能会有人质疑“结果的特殊性来源于伪随机算法的特殊性”。

  16. FatFish

    16楼 10月14日 物理版主, 优秀回答者
    3月前FatFish 重新编辑

    @ShongLee 我突然想起那个什么复杂度(名字记不住),可以用来衡量序列的随机性,主要思想是“能生成该序列的最短图灵机程序的长度就是这个序列的复杂度”(看到定义或许你知道我说的是什么复杂度)。

    柯尔莫戈洛夫复杂度( https://en.wikipedia.org/wiki/Kolmogorov_complexity

  17. 长岛冰茶

    17楼 10月14日 物理版主

    @ShongLee 不是蒙特卡罗 /:( 我这个需要10万*几百万个随机数,想想自己都不乐意干了

    这种量级的个数线性同余大概还能用吧(我们计算物理课检验了一下16807随机数的前$10^9$个

  18. 3月前小时 重新编辑

    @长岛冰茶 这种量级的个数线性同余大概还能用吧(我们计算物理课检验了一下16807随机数的前$10^9$个

    Numerical Recipes 3ed 一上来就声明
    ”Never use a generator principally based on a linear congruential generator (LCG) or a multiplicative linear congruential generator (MLCG). We say more about this below.”

    基本上这算法早就过时了:
    The idea of LCGs goes back to the dawn of computing, and they were widely used in the 1950s and thereafter. The trouble in paradise first began to be noticed in the mid-1960s

    @ShongLee 如果要比较不同算法的话,这个章节还推荐了其他几种比较安全的算法。 GitHub 上面有现成的代码,应该 c++ 和 fortran 都有。

  19. 2月前

    <random>里的都不够用吗。。
    1e11级别的数据硬盘塞得下吗。。。

  20. 6周前

    京斯

    20楼 12月11日 管理员

    同样推荐 random.org

  21. 5周前

    Linux内核提供了真随机数的接口
    直接读取/dev/random就行,不过这个随机数依赖于系统中断,读的太多可能会导致线程阻塞,建议只用来生成随机数种子,再使用伪随机获取随机数(伪随机的库很多就不提了)

 

后才能发言