亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

并發任務確定性地生成偽隨機數

并發任務確定性地生成偽隨機數

慕工程0101907 2021-08-14 15:59:03
我有一個協程返回偽隨機字節列表import asyncioimport randomimport osasync def random_bytes():    random.seed(a=1234)    results = []    for _ in range(0, 128):        await asyncio.sleep(int(os.urandom(1)[0])/4096)        results.append(random.getrandbits(8))    return resultsloop = asyncio.get_event_loop()task_1 = loop.create_task(random_bytes())print(loop.run_until_complete(task_1))正如預期的那樣,這個列表在每次運行時總是相同的,即使每一代之間的時間間隔不同[基于來自 的一些外部熵os.urandom],偽隨機數生成器的種子值也相同?,F在,如果我同時運行其中的兩個,則創建兩個列表...loop = asyncio.get_event_loop()task_1 = loop.create_task(random_bytes())task_2 = loop.create_task(random_bytes())print(loop.run_until_complete(asyncio.gather(task_1, task_2)))...列表總是不同的:任務基本上相互干擾,不再是確定性的。如何生成兩個并發的偽隨機數任務,其中每個偽隨機數列表都具有確定性,就好像沒有其他任務在運行一樣?[我的用例:測試并發行為,使用大量偽隨機數,以非確定性間隔生成,但希望偽隨機數本身對于每個任務的每次測試運行都相同]
查看完整描述

2 回答

?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

從random模塊文檔:


該模塊提供的函數實際上是 random.Random 類的隱藏實例的綁定方法。您可以實例化自己的 Random 實例以獲取不共享狀態的生成器。


async def random_bytes():

    generator = random.Random()

    generator.seed(1234)

    results = []

    for _ in range(0, 128):

        await asyncio.sleep(int(os.urandom(1)[0])/4096)

        results.append(generator.getrandbits(8))

    return results


查看完整回答
反對 回復 2021-08-14
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

您可以使用random.getstateand random.setstate,確保在設置狀態、生成隨機數和獲取狀態之間,您不會屈服于另一個任務。


async def random_bytes():

    random.seed(a=1234)

    state = random.getstate()

    results = []

    for _ in range(0, 128):

        await asyncio.sleep(int(os.urandom(1)[0])/4096)

        random.setstate(state)

        results.append(random.getrandbits(8))

        state = random.getstate()

    return results


查看完整回答
反對 回復 2021-08-14
  • 2 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號