从特定范围内生成一组排序后的随机数字。

7
我想在Python中生成一组x个唯一的随机数,并将它们排序。例如:range(1000, 10000),x = 100。
我已经知道如何导入random并使用random.randrange方法,然后循环获取100个随机数,并在最后对它们进行排序。
但是,我不知道如何获取唯一的数字(使它们不重复) - 我应该验证每一个循环吗?还是有其他更简单的方法来做到这一点?以及我应该如何对它们进行排序?
2个回答

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参数。


谢谢@Volatility!从没想过会这么简单。 还有一个问题 - 有没有办法将这些数字导出为csv或者xml格式? - Pavol Magic

0

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不同,后者返回的结果是未排序的。


详情

看一下这个配方,我们就能明白为什么要按照这个顺序进行。

来自itertools recipes

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。虽然索引是随机选择的,但它们后来被排序了。由于poolindices都是排序的,结果也是排序的。

总之,这与@Volatility的答案相同,只是排序是由系统自动处理的。

Cavaet: random_combinations 要求可迭代对象的长度超过r的值,否则会引发错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接