以随机顺序生成整数序列,而不预先构建整个列表

时间:2009-02-05 12:16:59

标签: algorithm random

如何生成从1到N但以随机顺序排列的整数列表,而不是在内存中构建整个列表?

(需要说明的是:生成列表中的每个数字只能出现一次,因此它必须等同于先在内存中创建整个列表,然后再进行混洗。)

这已被确定为this question的副本。

4 个答案:

答案 0 :(得分:1)

非常简单的随机是1 +((幂(r,x)-1)mod p)从1到p的x值从1到p并且将是随机的,其中r和p是素数和r <>页。

答案 1 :(得分:0)

技术上不是整个列表,但您可以使用位掩码来确定是否已经选择了一个数字。这比存储数字列表的存储量少得多。

将所有N位设置为0,然后为每个所需的数字设置:

  • 使用一种正常的线性全等方法来选择1到N之间的数字。
  • 如果已使用该号码,请找到下一个最高未使用的(0位),并使用wrap。
  • 将数字位设置为1并将其返回。

通过这种方式,您可以保证每个号码只使用一次并且相对随机。

答案 2 :(得分:-1)

你需要至少一半的总列表内存,只是为了记住你已经做过的事情。

如果您处境艰难,可以尝试:

  1. 将目前生成的结果保存在树中,随机化数据并将其插入树中。如果你不能插入然后生成另一个数字并再试一次,直到树中途填满。

  2. 当树中途填充时,你反过来了:你构造了一个树,上面有你尚未使用的数字,然后以随机顺序选择它们。

  3. 保留树结构有一些开销,但是当指针的大小远小于数据时,它可能会有所帮助。

答案 3 :(得分:-1)

指定要搜索解决方案的语言可能会有所帮助。

您可以使用动态列表存储生成的数字,因为您需要一个已经创建的数字的引用。每次创建新号码时,您都可以检查该号码是否包含在列表中,如果包含该号码则将其丢弃,然后重试。

没有这样一个列表的唯一可行方法是使用数字大小,如果算法正常工作,则不可能像UUID那样生成副本 - 但这并不保证没有重复是生成 - 这是非常不可能的。