两个不同的子进程没有生成唯一编号

时间:2017-03-24 01:24:21

标签: python

为什么两个独特的子进程没有生成唯一的随机数?

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

3 个答案:

答案 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为该算法播种。例如。