【发布时间】:2013-01-22 19:44:09
【问题描述】:
我想生成一组 x 个唯一随机数并在 Python 中对它们进行排序。例如: 范围(1000, 10000) x = 100
我想办法导入 random 并使用 random.randrange 方法,然后循环获取 100 个随机数,最后对它们进行排序。
但是,我不知道如何获得唯一的数字(这样它们就不会重复) - 我应该验证每个循环吗?或者还有其他更简单的方法吗?我应该如何对它们进行排序?
【问题讨论】:
我想生成一组 x 个唯一随机数并在 Python 中对它们进行排序。例如: 范围(1000, 10000) x = 100
我想办法导入 random 并使用 random.randrange 方法,然后循环获取 100 个随机数,最后对它们进行排序。
但是,我不知道如何获得唯一的数字(这样它们就不会重复) - 我应该验证每个循环吗?或者还有其他更简单的方法吗?我应该如何对它们进行排序?
【问题讨论】:
【讨论】:
more_itertools 实现 random_combinations itertools 配方,如果给定一个排序的输入,它会返回 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 不同,后者返回未排序的结果。
详情
查看配方,我们可以看到为什么要建立这个顺序。
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 的答案相同,只是为您处理排序。
Cavaet:random_combinations 要求 iterable 的长度超过 r 的值,否则会引发错误。
【讨论】: