我正在寻找最佳算法,其中M个线程生成给定范围(1 ... N)中的所有数字,但是以随机顺序。每个数字只应生成一次,结果数字的分布(这是好的术语?)应该尽可能相等(跨越线程和任何给定线程内部)
所以,我的第一次尝试是
算法就内存(N位)而言是足够好的,如果我是正确的话可能不是那么复杂(N * N,如果我是正确的),但分布似乎不是很平等
这里有问题:
是否有更好的算法(在内存使用,复杂性方面,首先是结果分配)?
答案 0 :(得分:1)
扩展,迈克尔的建议是使用线性时间算法,例如,Fisher--Yates,以顺序生成均匀的随机排列。然后,您可以使用静态分区方案为线程分配随机数(例如,使用k个线程,[0..k-1]中的线程i获取从n * i / k包含到n *(i + 1)/的元素k exclusive),或者你可以并行地从排列中“弹出”(例如,存储向量的当前长度,然后获取&添加-1以获取从中获取下一个元素的索引,或者只使用互斥锁)
如果这不是一个可以接受的解决方案,那么请详细说明为什么会出现这种情况以及随后用随机数做什么 - 很难想象顺序处理会非常昂贵。< / p>