我想生成范围内的随机数(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)
如果上述答案是肯定的,那么这一代人是否可逆(我可以从随机数中得到种子)吗?在这种情况下,这会被视为一种分组密码,即种子(密钥)和范围是否相同?
答案 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)
如果您想获得特定范围内的所有数字,
要么我们必须存储生成的随机数,并将它们与新生成的随机数进行比较
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
或者我们可以生成列表并像这样随机播放
data = range(10)
import random
random.shuffle(data)
print data
由于您已将总体作为列表并且random.shuffle
是就地操作,因此结果不必存储在单独的列表中。