簡體   English   中英

多線程以隨機順序生成范圍內的所有數字

[英]multithreaded generation of all numbers in range in random order

我正在尋找最好的算法,其中M個線程生成給定范圍(1 .. N)中的所有數字,但順序隨機。 每個數字只能生成一次,並且結果數字的分布(是否是個好術語?)應盡可能相等(在線程中和任何給定線程內部)

所以,我的第一次嘗試是

  1. 每個線程的編號為T(1..M)
  2. 每個線程都有一個N / M位的位圖(以標記已經生成的數字)
  3. 每個線程都會在0和N / M-1之間生成一個隨機位位置P。如果給定位設置為1,它將在右邊搜索第一個0(帶換行),因此復雜度為O(N * N)
  4. 我們將該位設置為1
  5. 位位置擴展為數字-基本上是P * M + T

就內存(N位)而言,算法已經足夠好,而對於O復雜度(如果我是正確的話,則為N * N)可能不夠好,但是分布似乎並不完全相等

所以這里的問題:

是否有更好的算法(在內存使用,復雜性以及首先是結果分配方面)?

Michael的擴展建議是使用線性時間算法(例如Fisher-Yates)按順序生成統一的隨機排列。 然后,您可以使用靜態分區方案為線程分配隨機數(例如,使用k個線程,[0..k-1]中的線程i將元素的值從n * i / k包括在內,變為n *(i + 1)/ k排它),或者您可以並行地從排列中“彈出”(例如,存儲向量的當前長度,然后獲取並加-1以獲取用於獲取下一個元素的索引,或者僅使用互斥體)。

如果這不是可接受的解決方案,那么請准確說明為什么會這樣,以及隨后您對隨機數的處理方式–很難想象這種情況下順序處理會變得非常昂貴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM