【问题标题】:Generate sequence of integers in random order without constructing the whole list upfront [duplicate]以随机顺序生成整数序列而不预先构建整个列表[重复]
【发布时间】:2010-10-05 15:58:19
【问题描述】:

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

(要明确一点:生成的列表中的每个数字只能出现一次,所以它必须相当于先在内存中创建整个列表,然后再洗牌。)

已确定与this question 重复。

【问题讨论】:

标签: algorithm random


【解决方案1】:

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

【讨论】:

  • 这不起作用。
【解决方案2】:

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

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

  • 使用一种正常的线性全等方法来选择从 1 到 N 的数字。
  • 如果该数字已被使用,则使用换行查找下一个最高未使用(0 位)。
  • 将该数字位设置为 1 并返回。

这样您就可以保证每个号码只能使用一次,并且结果相对随机。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      如果你记忆力不好,可以试试:

      1. 将目前生成的结果保存在树中,将数据随机化,然后将其插入树中。如果您无法插入,则生成另一个数字并重试,等等,直到树填满一半。

      2. 当树填充到一半时,您将其反转:您构建一棵树,其中包含您尚未使用的数字,然后以随机顺序挑选它们。

      保持树结构有一些开销,但当指针的大小比数据小得多时,它可能会有所帮助。

      【讨论】:

        猜你喜欢
        • 2022-06-24
        • 1970-01-01
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 2014-05-30
        • 2015-06-23
        • 1970-01-01
        相关资源
        最近更新 更多