5

我需要在不同的机器上并行运行 MonteCarlo 模拟。代码是用 c++ 编写的,但程序是使用 python 脚本设置和启动的,该脚本设置了很多东西,尤其是随机种子。函数 setseed 是一个 4 字节的无符号整数

使用一个简单的

import time
setseed(int(time.time()))

不是很好,因为我将作业提交到集群上的队列,它们保持等待几分钟然后它们开始,但是开始时间是不可预测的,可能是两个作业同时开始(秒),所以我切换到:

setseet(int(time.time()*100))

但我不开心。什么是最好的解决方案?也许我可以结合以下信息:时间、机器 ID、进程 ID。或者也许最好的解决方案是从 /dev/random (linux机器)读取?

如何从 /dev/random 读取 4 个字节?

f = open("/dev/random","rb")
f.read(4)

给我一个字符串,我要一个整数!

4

4 回答 4

5

阅读/dev/random是个好主意。只需将 4 字节字符串转换为整数:

f = open("/dev/random","rb")
rnd_str = f.read(4)

要么使用结构:

import struct
rand_int = struct.unpack('I', rnd_string)[0]

需要更新大写 I。

或相乘并相加:

rand_int = 0
for c in rnd_str:
    rand_int <<= 8
    rand_int += ord(c)
于 2010-03-07T12:48:40.870 回答
2

您可以简单地将四个字节复制到一个整数中,这应该是您最不担心的。

但是并行伪随机数生成是一个相当复杂的话题,而且往往做得不好。通常您在一台机器上生成种子并将它们分发给其他机器。

看看SPRNG,它可以解决您的问题。

于 2010-03-07T12:49:11.283 回答
1

如果这是 Linux 或类似的操作系统,你会想要/dev/urandom——它总是立即生成数据。

/dev/random可能会停止等待系统收集随机性。它确实会产生加密级随机数,但这对您的问题来说太过分了。

于 2010-03-07T21:34:09.223 回答
0

您可以使用随机数作为种子,其优点是与操作系统无关(不需要 /dev/random),无需从字符串转换为整数:

为什么不简单地使用

random.randrange(-2**31, 2**31)

作为每个过程的种子?稍微不同的开始时间会产生截然不同的种子,这样......</p>

random.jumpahead如果您大致知道每个进程将使用多少个随机数(文档random.WichmannHill.jumpahead很有用) ,您也可以选择使用该方法。

于 2010-03-07T20:44:27.077 回答