繁体   English   中英

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

[英]Two different child process not generating unique number

为什么两个唯一的子进程不会生成唯一的随机数?

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

导入random模块时,它将为RNG提供默认种子。 然后,当您进行分叉时,子进程将继承此种子。 因此,两个子进程都从相同的默认种子开始。

您需要在每个进程中使用不同的参数调用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()

每个过程中都没有参数。

Python的random模块是一个伪随机数生成器。 为了获得不同的输出,您需要将种子扰动到不同的位置。

random.seed()

默认情况下, python使用系统时间作为种子,或者使用操作系统提供的某些硬件随机化os.urandom()如果有的话,请从os.urandom()明确获取)。 通常,这足够了,但是在某些情况下(例如,两个进程的系统时间相同),您需要手动进行。

当python进程生成“随机”数时,它实际上是在使用确定性算法。 该算法具有许多特性,使其看起来像在生成随机数。 它使用的第一个值称为种子值,这非常重要,因为每个后续值都是从先前的输出值生成的。 您正在运行完全相同的过程,因此两次都使用相同的种子值。 因此将生成相同的值序列。

例如,如果您希望两个进程返回不同的序列,则可以尝试使用pid播种算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM