![](/img/trans.png)
[英]dynamically generating unique combo box and filling them with two different sources
[英]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.