【问题标题】:Fix a function returning duplicates over time?修复随着时间的推移返回重复项的函数?
【发布时间】:2013-06-19 02:50:15
【问题描述】:

我这里有一个函数,它返回一个 4 位数的字符串。问题是当我运行该函数 500 次或更多时,它开始返回重复项。如何避免?

我的功能:

import random
def CreatePass():
    Num = str(random.randint(1000, 9999)
    return Num

【问题讨论】:

  • 随机函数通常没有不返回重复项的约束。它们只能是随机的。您必须自己实现该功能。
  • @KingMak 就因为你年轻,你不能免于逻辑。
  • 令人震惊的是,从 8999 个元素中选择一个元素 500 次时发生碰撞的几率为 5.6%。结合伪随机选择的局限性,我想知道为什么会发生这种情况!
  • 公平地说。 OP 正在询问如何避免重复 - 他们并没有对此表示惊讶。对我来说,这似乎是一个完全合理的问题。
  • 哈哈,好吧,化身是一块磁铁,我承认。但@King 是绝对正确的:所有这些反对票和没有人(还)费心说出原因。

标签: python random


【解决方案1】:

@Martijn 的解决方案就足够了,因为您只需要存储和随机播放 9000 个数字。如果您想要更大范围内的数字并且您知道(大约)需要多少个数字,那么有一个更好的方法:函数random.sample 将为您提供所需范围内的数字without 重复。例如,要获得 500 个不同的六位数字,您可以使用:

selected = random.sample(xrange(100000, 1000000), 500)

【讨论】:

  • 很好,这个答案对我年轻的头脑来说更容易理解,也更容易实施。
  • 所以这意味着 random.sample 根本不返回重复项?你能再解释一下吗
  • 是的,确实如此。查看它的文档(链接)。还可以查看xrange
  • 嗯,模棱两可的答案:是的,这确实意味着 random.sample 不返回重复项。这就是它的用途。
【解决方案2】:

没有重复的随机序列不是随机的。

您可以通过增加可能值的范围来降低重复的可能性。

或者,您可以记录以前的返回值,如果以前返回过,则选择一个新值。

最后,你可以生成整个序列,然后随机播放。

当然,然后你需要弄清楚一旦你用尽了可能的返回值之后该怎么做,以及一旦只有少数可能的返回值时的行为是否真的是可取的。

此外,您应该遵守标准的 Python 编码标准。

【讨论】:

    【解决方案3】:

    可以自己动手,希望不要用尽:

    from random import shuffle
    def myrandom(start, end):
        possible = range(start, end)
        shuffle(possible)
        for i in possible:
            yield str(i)
    
    randoms = myrand(1000, 9999)
    print next(randoms)
    print next(randoms)
    # etc...
    

    当它用尽时你会得到一个StopIteration...

    【讨论】:

      【解决方案4】:

      生成一个列表,在每次调用函数时将其打乱并从中弹出:

      import random
      
      def CreatePass(_numbers=[]):
          if not _numbers:
              _numbers[:] = range(1000, 10000)
              random.shuffle(_numbers)              
          return str(_numbers.pop())
      

      请注意,一旦你用完,这会重新生成 _numbers 列表,但是你已经用完了所有 8999 个可能的数字,并且无论如何都必须接受重复。

      【讨论】:

      • 使用deque而不是列表来加快弹出操作。
      猜你喜欢
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      相关资源
      最近更新 更多