从一个特定的范围内生成一组分类随机数(Generate a set of sorted random

2019-07-19 12:51发布

我想生成一组X独特的随机数和Python中对它们进行排序。 例如:范围(1000,10000)X = 100

我已经想通了导入随机并使用random.randrange方法,然后循环得到100张随机数,并最终对它们进行排序。

不过,我不知道如何获得唯一编号(例如,他们不重复) - 我应该验证每一个循环? 还是有其他更简单的方法怎么办呢? 我应该如何对它们进行排序?

谢谢你们!

Answer 1:

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



Answer 2:

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都进行排序,结果也会分类。

总之,这确实一样@波动的回答,只是排序为您处理。

Cavaet: random_combinations需要迭代的长度超过的值r否则产生一个错误。



文章来源: Generate a set of sorted random numbers from a specific range