我该如何使用随机跳转在Python中

2024-09-29 12:27:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序可以做1000次特定的实验(多线程,这样多个实验同时进行)。每个实验都需要。50随机。随机()电话。在

什么是最好的方法来获得这个真正的随机性。我可以复制一个随机的物体到每个实验中,然后做一个比50000*expid快的多的东西。文件显示jumpahead(1)已经扰乱了州政府,但这真的是真的吗?在

或者有没有其他的方法可以做到“最好的方法”?在

(不,随机数不是用于安全性,而是用于metropolis-hasting算法。唯一的要求是实验是独立的,而不是随机序列是否可以预测


Tags: 文件方法算法应用程序序列物体电话随机性
3条回答

jumpahead(1)确实足够了(在random的当前实现中,与jumpahead(50000)或任何其他类似的调用相同——我相信这是与基于Mersenne Twister的实现同时出现的)。所以使用任何符合程序逻辑的参数。(当然,为了线程安全起见,请为每个线程使用一个单独的random.Random实例,正如您的问题已经提示的那样)。在

random模块生成的数字并不意味着具有较强的加密性,因此您没有将其用于安全目的是一件好事;-)。在

I could copy a random object to every experiment and do than a jumpahead of 50.000 * expid.

大致正确。每个线程都有自己的Random实例。在

将所有这些种子设定为相同的种子值。使用一个常量来测试,在“为记录运行”时使用/dev/random。在

编辑。在Python外部和较旧的实现中,使用jumpahead( 50000 * expid )来避免两个生成器最终得到一个并行的值序列的情况。在任何合理的当前(post 2.3)Python中,jumpahead不再是线性的,使用expid就足以扰乱状态。在

不能简单地在每个线程中执行jumpahead(1),因为这样可以确保它们是同步的。使用jumpahead( expid )来确保每个线程都被清楚地置乱。在

The documentation suggests that jumpahead(1) already scrambles the state, but is that really true?

是的,jumpahead确实“搅乱”了整个州。回想一下,对于一个给定的种子,你会得到一个——很长——但固定的伪随机数序列。你在这个序列中跳得很快。要通过随机性测试,您必须从这个一个序列中获取所有值。在

编辑。从前,跳跃前进(1)是有限的。现在jumpahead(1)真的做了一个更大的混乱。然而,这种置乱是确定性的。不能简单地在每个线程中执行jumpahead(1)。在

如果你有多个具有不同种子的生成器,你就违反了“一个种子中有一个序列”的假设,你的数字不会像从一个序列中得到一样随机。在

如果你只跳转1,你可能会得到相似的平行序列。[这种相似性可能无法检测到;理论上,存在相似性。]

当你领先50000,你保证你遵循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]

你不应该使用那个函数。没有证据表明它能在梅森扭线机上工作。事实上,它是{a1}。在

有关在并行环境中生成伪随机数的更多信息,请参见this article from David Hill。在

相关问题 更多 >