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

7 投票
2 回答
13552 浏览
提问于 2025-04-17 15:05

我想在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(池)。虽然选择的索引是随机的,但最后会对它们进行排序。因为 poolindices 都是有序的,所以最终的结果也是有序的。

总的来说,这个功能的效果和 @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 参数。

撰写回答