从特定范围生成一组有序的随机数
我想在Python中生成一组x个独特的随机数字,并对它们进行排序。例如:范围是1000到10000,x=100。
我已经知道要导入random模块,使用random.randrange方法,然后循环获取100个随机数字,最后再对它们进行排序。
但是,我不知道怎么才能得到不重复的数字(也就是每个数字都不一样)——我是不是需要在每次循环时都进行验证?还是有其他更简单的方法?还有,我应该怎么对这些数字进行排序?
2 个回答
0
more_itertools
是一个库,它实现了 random_combinations
这个功能。这个功能可以从一个已经排好序的输入中,返回 r
个随机的、排好序的数字。
import more_itertools as mit
mit.random_combination(range(1000, 10000), r=100)
# (1016, 1112, 1233, 1367, 1446, 1460, 1518, 1807, 1832, 1956, ...)
这和 random.sample
不一样,后者返回的结果是无序的。
详细信息
看看这个功能的实现,我们就能明白为什么结果是有序的。
根据 itertools 的文档:
def random_combination(iterable, r):
"""Return a random *r* length subsequence of the elements in *iterable*.
>>> random_combination(range(5), 3) # doctest:+SKIP
(2, 3, 4)
This equivalent to taking a random selection from
``itertools.combinations(iterable, r)``.
"""
pool = tuple(iterable)
n = len(pool)
indices = sorted(sample(range(n), r))
return tuple(pool[i] for i in indices)
range()
本身就是排好序的,它成为了随机选择元素的 pool
(池)。虽然选择的索引是随机的,但最后会对它们进行排序。因为 pool
和 indices
都是有序的,所以最终的结果也是有序的。
总的来说,这个功能的效果和 @Volatility 的回答是一样的,只不过排序的过程是自动处理的。
注意: random_combinations
要求输入的可迭代对象的长度必须大于 r
的值,否则会出现错误。
11
使用 random.sample
来进行随机抽样。
numbers = random.sample(xrange(1000, 10000), 100) # or `range` in Python 3
排序这部分很简单 - 你可以用 list.sort
方法。
numbers.sort()
默认情况下,这个方法会把列表从小到大排序,但它也可以接收一个可选的 key
参数,用来指定排序的依据。
还有一个 sorted
函数,它不会直接修改原来的列表,而是返回一个新的排序后的列表。
numbers_sorted = sorted(numbers)
这个函数同样也可以接受一个可选的 key
参数。