簡體   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