如何获得真正的随机数?

  1. 3月前

    最近有个模拟需要用到随机数,而且因为该模拟有很长很长的步骤,普通伪随机系列根本满足不了要求。我想到一些方案:
    1、读取某个东西的温度。如果能读到0.01摄氏度这样的话,那么最后一位作为随机数是个不错的选择,当然这种随机数的时间相关性很大。
    2、屏幕持续播放各种风格的视频,然后读取屏幕的像素点的颜色。感觉和读取温度差不多。
    3、显然手动抛骰子能得到非常好的前后互相独立的随机序列,但是效率太低了。或许可以下载往期福利彩票的开奖数据来用,可是不知道这么多期究竟够不够用。

    这个随机序列需要满足的是:前后项互相独立;均匀分布;在程序需要的情况下,能持续提供随机数。上面三种方案各有优缺点,没有一种是完全符合这三个要求的。
    请教一下各位,有没有满足要求的随机数产生方法?

  2. 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. 5周前

    京斯

    20楼 12月11日 管理员

    同样推荐 random.org

  21. 更新的帖子 ›
 

后才能发言