我想要一个算法/函数,给定数字N,在恒定时间内生成从0到N-1的随机数。在第N次通话后,该功能可以随心所欲。此外,重要的是算法在请求时生成数字而不是使用混洗,因为我可能(并且在一般情况下)不需要完整的数字列表。最好的方法是什么?
(可选阅读)我想过有一组哈希值,并且一次拉出一个数字,但这需要先将所有元素(我经常不需要)插入到哈希集中。这不行...... Argh
感谢您提前提供任何帮助。
答案 0 :(得分:1)
通过使用仅存储已移动元素的地图替换数组来修改Fisher–Yates shuffle。在Python中:
import random
class Shuffle:
def __init__(self, n):
self.d = {}
self.n = n
def generate(self):
i = random.randrange(self.n)
self.n -= 1
di = self.d[i] if i in self.d else i # idiomatically, self.d.get(i, i)
dn = self.d[self.n] if self.n in self.d else self.n
self.d[i] = dn
self.d[self.n] = di
return di
空间使用和摊销的预期运行时间是实际生成的每个元素的O(1)个单词。最多记录因子,这是最佳的。