【发布时间】:2010-10-05 15:58:19
【问题描述】:
如何生成从 1 到 N 的整数列表,但顺序是随机的,而无需在内存中构建整个列表?
(要明确一点:生成的列表中的每个数字只能出现一次,所以它必须相当于先在内存中创建整个列表,然后再洗牌。)
已确定与this question 重复。
【问题讨论】:
如何生成从 1 到 N 的整数列表,但顺序是随机的,而无需在内存中构建整个列表?
(要明确一点:生成的列表中的每个数字只能出现一次,所以它必须相当于先在内存中创建整个列表,然后再洗牌。)
已确定与this question 重复。
【问题讨论】:
非常简单的随机数是 1+((power(r,x)-1) mod p) 将是从 1 到 p 对于 x 的值从 1 到 p 并且将是随机的,其中 r 和 p 是素数并且 r 页。
【讨论】:
技术上不是整个列表,但您可以使用位掩码来确定是否已经选择了一个数字。这比号码列表本身的存储空间要少得多。
将所有 N 位设置为 0,然后为每个所需的数字:
这样您就可以保证每个号码只能使用一次,并且结果相对随机。
【讨论】:
指定您正在搜索解决方案的语言可能会有所帮助。
您可以使用动态列表来存储生成的号码,因为您需要参考您已经创建的号码。每次创建新号码时,您可以检查该号码是否包含在列表中,如果包含则将其丢弃并重试。
没有这样一个列表的唯一可能方法是使用一个数字大小,如果算法正常工作,则不太可能生成像 UUID 这样的重复项 - 但这并不能保证不会生成重复项 -这是极不可能的。
【讨论】:
您将需要至少一半的总列表内存,只是为了记住您已经做过的事情。
如果你记忆力不好,可以试试:
将目前生成的结果保存在树中,将数据随机化,然后将其插入树中。如果您无法插入,则生成另一个数字并重试,等等,直到树填满一半。
当树填充到一半时,您将其反转:您构建一棵树,其中包含您尚未使用的数字,然后以随机顺序挑选它们。
保持树结构有一些开销,但当指针的大小比数据小得多时,它可能会有所帮助。
【讨论】: