为什么两个独特的子进程没有生成唯一的随机数?
import os
import string
import random
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
print ''.join(random.choice(chars) for x in range(size)).lower()
os._exit(0)
for i in range(2):
newpid = os.fork()
if newpid == 0:
id_generator()
else:
print "Parent"
输出显示相同的随机数:
Parent
Parent
q52mno
q52mno
答案 0 :(得分:3)
导入random
模块时,它会为RNG提供默认种子。然后当你fork时,子进程继承这个种子。因此,两个子进程都以相同的默认种子开始。
您需要使用不同的参数在每个进程中调用random.seed()
,或者将PID添加到时间。
for i in range(2):
newpid = os.fork()
if newpid == 0:
random.seed(os.pid() + time.time())
id_generator()
else:
print "Parent"
如果您知道您的Python实现使用操作系统的良好随机源,您可以致电:
random.seed()
每个过程都没有参数。
答案 1 :(得分:0)
Python的random
模块是伪随机数字生成器;为了得到不同的输出,你需要将种子扰乱到不同的东西。
random.seed()
By default python使用系统时间作为种子,或使用OS提供的一些硬件随机化器(如果可用,则从os.urandom()
明确获取)。通常,这已经足够了,但在某些情况下,如果这两个进程具有相同的系统时间,则需要手动完成。
答案 2 :(得分:0)
当python进程生成“随机”数字时,它确实使用了确定性算法。该算法具有一系列属性,使其看起来像是在生成随机数。它使用的第一个值称为种子值,它非常重要,因为每个后续值都是从前一个输出值生成的。您正在运行完全相同的过程,因此您两次都使用相同的种子值。因此将生成相同的值序列。
如果您希望这两个进程返回不同的序列,您可以尝试使用pid为该算法播种。例如。