【问题标题】:Generate a set of sorted random numbers from a specific range从特定范围内生成一组排序的随机数
【发布时间】:2013-01-22 19:44:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: python random generator


    【解决方案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 参数。

    【讨论】:

    • 感谢@Volatility!从来没有想过这很容易。还有一件事 - 有没有办法将这些数字导出到 csv 或者说是 xml 格式?
    【解决方案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 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 的答案相同,只是为您处理排序。

    Cavaetrandom_combinations 要求 iterable 的长度超过 r 的值,否则会引发错误。

    【讨论】:

      猜你喜欢
      • 2016-05-04
      • 2011-02-02
      • 2015-04-08
      • 2014-10-23
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多