【问题标题】:How to generate a range of random numbers in python without repetition如何在python中生成一系列随机数而不重复
【发布时间】:2014-03-11 18:48:39
【问题描述】:

我想在 (0..."MAX") 范围内生成随机数。我想制作一个循环,这样每次循环都会生成一个新的唯一随机数(不应重复)。循环将继续总共“MAX”次。总共应该有“MAX”个随机数。排序时,值应为 0..."MAX";没有重复。

限制: - 假设 MAX 远大于 int。 (没有内存可以将所有数字排列存储在内存中)

我提出的解决方案: 如果我从 0...MAX 为生成器播种,是否可以像下面的函数一样打印 0 到 MAX 之间的每个唯一数字?假设没有空间来存储所有数字并打乱它们。

for x in range (0, MAX):
    random.seed(x)
    num=random.randint(0, MAX)
    print("seed = ",x, "    random number = ", num)

如果上面的答案是肯定的,那么这一代是可逆的(我可以从随机数中得到种子)吗?在哪种情况下,如果种子(密钥)和范围长度相同,这将被视为一种分组密码?

【问题讨论】:

  • 你能解释一下你想要什么输出吗?您的代码无效,因为 randint 需要参数。此外,您的代码中的任何内容都不会阻止重复。为什么每次迭代都要重新播种生成器?
  • Tnx。固定的。我希望每次迭代都有一个 0...Max 范围内的新随机数,并且它不能与以前的数字重复。我正在播种,因为我猜测唯一的种子意味着 PRG 的第一次迭代的唯一编号,但我不知道 prg 在重复之前将采用的最大种子是多少。假设没有存储所有数字的内存。
  • “考虑了一种分组密码” - 如果您打算将其用于任何类型的加密目的,不要
  • 只是用它来生成非重复随机,但很好奇它是否符合分组密码的描述。
  • 你对“随机性”有什么要求?它是否必须足够好才能进行模拟?密码学?它只需要不重复吗? MAX 有多大?

标签: python random seed


【解决方案1】:

你可以这样做:

input = set()
for i in range(MAX):
    input.add(random.randrange(x,y))
print input

在 x 和 y 的范围内,它将选择一些随机值。 W/o 重复意味着你可以使用 set。所以我要添加这些值来设置。

试试这个吧。

【讨论】:

    【解决方案2】:

    随机模块有一个sample function,它基于产生unique elements。如下例所示:

    random_list = random.sample(xrange(10000000), 60) 
    # generates a list of 60 random numbers in the 
    # range 0 to 10000000 without repetition
    

    但是,请注意,如果列表的长度大于人口的大小,它将引发异常,例如

    random_list = random.sample(xrange(5), 60 # you will get a ValueError here
    

    【讨论】:

    • “请注意,如果列表的长度大于人口的大小,它将重复” - 不,它不会。它将引发ValueError。为什么你认为它会重复?
    • 另外,你不能从5取样。
    • @user1144251 您正在寻找random.shuffle,就像我在回答中显示的那样。
    • 这适用于小型设备。但是对于大量它不起作用,即:random.sample(range(78364164095),78364164095)
    【解决方案3】:

    如果要获取特定范围内的所有数字,

    1. 要么我们必须存储生成的随机数并将它们与新生成的随机数进行比较

      import random
      result = []
      
      # hash values of numbers between -5 to 256 are the same as the
      # numbers themselves. So, whatever may be the order, set will have them
      # in the sorted order. So, `result` cannot be a `set` here.
      
      for x in range (0, 10):
          num = random.randint(0, 10)
          while num in result:
              num = random.randint(0, 10)
          result.append(num)
      print result
      
    2. 或者我们可以生成列表并像这样打乱它

      data = range(10)
      import random
      random.shuffle(data)
      print data
      

      由于您已经将人口作为一个列表,并且random.shuffle 是一个就地操作,因此不必将结果存储在单独的列表中。

    【讨论】:

    • 假设没有足够的内存来存储内存中的所有内容。
    • @user1144251 那么你将如何生成随机数并存储呢?
    • 第一种方式应该使用集合,而不是列表。列表(向量)需要 O(N) 时间来查找它是否有项目,而对于基于散列的集合,它需要 O(1) 时间(平均)。
    • @SergeyDymchenko 散列值在 -5 到 256 之间的数字与数字本身相同。因此,无论顺序如何,set 都会将它们按排序顺序排列。所以,我们不能在这里使用set
    • 不存储随机数只是打印出来(流式传输)不存储。
    猜你喜欢
    • 2013-07-02
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多