繁体   English   中英

从特定范围生成一组排序的随机数

[英]Generate a set of sorted random numbers from a specific range

我想生成一组 x 唯一随机数并在 Python 中对它们进行排序。 例如:范围(1000, 10000) x = 100

我想出了导入 random 并使用 random.randrange 方法,然后循环获取 100 个随机数,最后对它们进行排序。

但是,我不知道如何获得唯一的数字(这样它们就不会重复) - 我应该验证每个循环吗? 或者有没有其他更简单的方法来做到这一点? 我应该如何对它们进行排序?

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

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 食谱

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的值,否则会引发错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM