独特的随机数算法

时间:2013-08-20 02:53:28

标签: performance algorithm random unique

我想要一个算法/函数,给定数字N,在恒定时间内生成从0到N-1的随机数。在第N次通话后,该功能可以随心所欲。此外,重要的是算法在请求时生成数字而不是使用混洗,因为我可能(并且在一般情况下)不需要完整的数字列表。最好的方法是什么?

(可选阅读)我想过有一组哈希值,并且一次拉出一个数字,但这需要先将所有元素(我经常不需要)插入到哈希集中。这不行...... Argh

感谢您提前提供任何帮助。

1 个答案:

答案 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)个单词。最多记录因子,这是最佳的。