如何生成从1到N但以随机顺序排列的整数列表,而不是在内存中构建整个列表?
(需要说明的是:生成列表中的每个数字只能出现一次,因此它必须等同于先在内存中创建整个列表,然后再进行混洗。)
这已被确定为this question的副本。
答案 0 :(得分:1)
非常简单的随机是1 +((幂(r,x)-1)mod p)从1到p的x值从1到p并且将是随机的,其中r和p是素数和r <>页。
答案 1 :(得分:0)
技术上不是整个列表,但您可以使用位掩码来确定是否已经选择了一个数字。这比存储数字列表的存储量少得多。
将所有N位设置为0,然后为每个所需的数字设置:
通过这种方式,您可以保证每个号码只使用一次并且相对随机。
答案 2 :(得分:-1)
你需要至少一半的总列表内存,只是为了记住你已经做过的事情。
如果您处境艰难,可以尝试:
将目前生成的结果保存在树中,随机化数据并将其插入树中。如果你不能插入然后生成另一个数字并再试一次,直到树中途填满。
当树中途填充时,你反过来了:你构造了一个树,上面有你尚未使用的数字,然后以随机顺序选择它们。
保留树结构有一些开销,但是当指针的大小远小于数据时,它可能会有所帮助。
答案 3 :(得分:-1)
指定要搜索解决方案的语言可能会有所帮助。
您可以使用动态列表存储生成的数字,因为您需要一个已经创建的数字的引用。每次创建新号码时,您都可以检查该号码是否包含在列表中,如果包含该号码则将其丢弃,然后重试。
没有这样一个列表的唯一可行方法是使用数字大小,如果算法正常工作,则不可能像UUID那样生成副本 - 但这并不保证没有重复是生成 - 这是非常不可能的。