以随机顺序生成范围内所有数字的多线程生成

时间:2014-03-30 10:23:37

标签: multithreading algorithm random

我正在寻找最佳算法,其中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
  6. 算法就内存(N位)而言是足够好的,如果我是正确的话可能不是那么复杂(N * N,如果我是正确的),但分布似乎不是很平等

    这里有问题:

    是否有更好的算法(在内存使用,复杂性方面,首先是结果分配)?

1 个答案:

答案 0 :(得分:1)

扩展,迈克尔的建议是使用线性时间算法,例如,Fisher--Yates,以顺序生成均匀的随机排列。然后,您可以使用静态分区方案为线程分配随机数(例如,使用k个线程,[0..k-1]中的线程i获取从n * i / k包含到n *(i + 1)/的元素k exclusive),或者你可以并行地从排列中“弹出”(例如,存储向量的当前长度,然后获取&添加-1以获取从中获取下一个元素的索引,或者只使用互斥锁)

如果这不是一个可以接受的解决方案,那么请详细说明为什么会出现这种情况以及随后用随机数做什么 - 很难想象顺序处理会非常昂贵。< / p>