我有一个应用程序执行1000次特定实验(多线程,以便同时进行多个实验).每个实验都需要appr.50.000 random.random()调用.
什么是让它真正随机的最佳方法.我可以将一个随机对象复制到每个实验,而不是一个50.000*expid的跳跃.文件表明,跳头(1)已经扰乱了状态,但这是真的吗?
还是有另一种方式以"最好的方式"做到这一点?
(不,随机数不是用于安全性,而是用于大都市hasting算法.唯一的要求是实验是独立的,而不是随机序列是否以某种方式可预测等)
我可以将一个随机对象复制到每个实验,而不是一个50.000*expid的跳跃.
大致正确.每个线程都有自己的Random实例.
将它们全部播种到相同的种子值.使用常量进行测试,在"运行记录"时使用/ dev/random.
编辑.在Python之外和较旧的实现中,用于jumpahead( 50000 * expid )避免两个生成器结束并行的值序列的情况.在任何合理的当前(2.3后)Python中,jumpahead不再是线性的,使用expid足以扰乱状态.
你不能简单地jumpahead(1)在每个线程中做,因为这将确保它们是同步的.使用jumpahead( expid )以确保每个线程都明显打乱.
文件表明,跳头(1)已经扰乱了状态,但这是真的吗?
是的,跳头确实"争抢"了这个州.回想一下,对于给定的种子,你得到一个长但固定的伪随机数序列.你按照这个顺序跳了起来.要通过随机性测试,您必须从这一个序列中获取所有值.
编辑.曾几何时,跳远(1)是有限的.现在,jumpahead(1)真的做了更大的争抢.然而,加扰是确定性的.你不能简单地jumpahead(1)在每个线程中做.
如果您有多个具有不同种子的生成器,则违反了"来自一个种子的一个序列"假设,并且您的数字不会像从单个序列中获取它们那样随机.
如果您只跳转1,您可能会获得可能类似的并行序列.[这种相似性可能无法检测到; 从理论上讲,这是相似的.]
当你跳过50,000,你保证你遵循1序列-1种子的前提.您还可以确保在两个实验中不会有相邻的数字序列.
最后,您还具有可重复性.对于给定的种子,您可以获得一致的结果.
同样的跳远:不好.
>>> y=random.Random( 1 )
>>> z=random.Random( 1 )
>>> y.jumpahead(1)
>>> z.jumpahead(1)
>>> [ y.random() for i in range(5) ]
[0.99510321786951772, 0.92436920169905545, 0.21932404923057958, 0.20867489035315723, 0.91525579001682567]
>>> [ z.random() for i in range(5) ]
[0.99510321786951772, 0.92436920169905545, 0.21932404923057958, 0.20867489035315723, 0.91525579001682567]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2380 次 |
| 最近记录: |