我有一个应用程序可以做1000次特定的实验(多线程,这样多个实验同时进行)。每个实验都需要。50随机。随机()电话。在
什么是最好的方法来获得这个真正的随机性。我可以复制一个随机的物体到每个实验中,然后做一个比50000*expid快的多的东西。文件显示jumpahead(1)已经扰乱了州政府,但这真的是真的吗?在
或者有没有其他的方法可以做到“最好的方法”?在
(不,随机数不是用于安全性,而是用于metropolis-hasting算法。唯一的要求是实验是独立的,而不是随机序列是否可以预测
Tags:
jumpahead(1)
确实足够了(在random
的当前实现中,与jumpahead(50000)
或任何其他类似的调用相同——我相信这是与基于Mersenne Twister的实现同时出现的)。所以使用任何符合程序逻辑的参数。(当然,为了线程安全起见,请为每个线程使用一个单独的random.Random
实例,正如您的问题已经提示的那样)。在(
random
模块生成的数字并不意味着具有较强的加密性,因此您没有将其用于安全目的是一件好事;-)。在大致正确。每个线程都有自己的
Random
实例。在将所有这些种子设定为相同的种子值。使用一个常量来测试,在“为记录运行”时使用/dev/random。在
编辑。在Python外部和较旧的实现中,使用
jumpahead( 50000 * expid )
来避免两个生成器最终得到一个并行的值序列的情况。在任何合理的当前(post 2.3)Python中,jumpahead
不再是线性的,使用expid
就足以扰乱状态。在不能简单地在每个线程中执行
jumpahead(1)
,因为这样可以确保它们是同步的。使用jumpahead( expid )
来确保每个线程都被清楚地置乱。在是的,jumpahead确实“搅乱”了整个州。回想一下,对于一个给定的种子,你会得到一个——很长——但固定的伪随机数序列。你在这个序列中跳得很快。要通过随机性测试,您必须从这个一个序列中获取所有值。在
编辑。从前,跳跃前进(1)是有限的。现在jumpahead(1)真的做了一个更大的混乱。然而,这种置乱是确定性的。不能简单地在每个线程中执行
jumpahead(1)
。在如果你有多个具有不同种子的生成器,你就违反了“一个种子中有一个序列”的假设,你的数字不会像从一个序列中得到一样随机。在
如果你只跳转1,你可能会得到相似的平行序列。[这种相似性可能无法检测到;理论上,存在相似性。]
当你领先50000,你保证你遵循1序列1种子的前提。你还可以保证在两个实验中不会有相邻的数字序列。在
最后,你还有重复性。对于给定的种子,可以得到一致的结果。
同样的跳跃:不好。在
你不应该使用那个函数。没有证据表明它能在梅森扭线机上工作。事实上,它是{a1}。在
有关在并行环境中生成伪随机数的更多信息,请参见this article from David Hill。在
相关问题 更多 >
编程相关推荐