[英]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.