如何在python中生成一系列随机数而不重复

时间:2014-02-13 04:01:33

标签: python random seed

我想生成范围内的随机数(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)

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

3 个答案:

答案 0 :(得分:1)

随机模块有一个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

答案 1 :(得分:1)

你可以这样做:

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

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

试试这个。

答案 2 :(得分:0)

如果您想获得特定范围内的所有数字,

  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是就地操作,因此结果不必存储在单独的列表中。