如何在Python中随机生成递减数字?

Fio*_*wok 4 python random numbers python-2.7

我想知道是否有办法在一定范围内产生减少的数字?我想编程以保持输出直到它达到0,并且范围中的最高数字必须是正数.

例如,如果范围是(0,100),则可能是可能的输出:96 57 43 23 9 0

对不起原帖的混淆

Lew*_*ton 15

我会生成一个n个随机数的列表,然后将它们从最高到最低排序.

  • "随意"是一个相当模糊的术语.我会说这将是一种不同类型的随机性.我认为这将是统一的. (4认同)

fre*_*ish 5

没什么要注意的。X > 0在每个步骤中开始并在每个步骤中都采用随机数进行(0,X)替换的算法X是不好的。为什么?因为(假设random行为正确)每个步骤的期望值都在间隔的中间(0,X)。这意味着,这些数字的序列有望收敛0(1/2)^N。的确很容易看出0,即使是巨大的初始值,大多数数字也都在附近。这意味着这些数字的分布不均匀,这在大多数情况下是期望的属性。

这是一个主要的缺点,即使生成N数字的复杂度是O(N)(更重要的是)内存使用量也是如此O(1)

另一种解决方案是只对N随机数进行排序。这还不错,尽管该算法的复杂度O(N log(N))(或与基础排序算法的复杂度相同)可以降低为O(N)如果我们将元素按顺序而不是排序,但是内存使用量是O(N)-我们必须记住所有元素。但是,这些数字将均匀分布,这是一个很大的优势!

遵循乔恩·路易斯·本特利(Jon Louis Bentley)在论文“ 生成随机数的排序列表 ”中的想法,这里是可能是最优化的算法(至少对我来说是这样),并且生成均匀分布的数字:

import math
import random

def generate( min = 0, max = 10, number = 100 ):
    start = 0
    for i in xrange( number, 0, -1 ):
        start = start + math.log( random.random( ) ) / i
        next = math.exp( start ) * ( max - min ) + min
        yield next

for number in generate( ):
    print number
Run Code Online (Sandbox Code Playgroud)

请注意,该算法的复杂度仍然很高O(N)(我怀疑会降低),但是内存使用率却是这样,O(1)并且这些数字均匀地分布在interval中(min,max),这不是很明显,但确实如此。唯一的缺点是我们必须在开始之前知道要生成多少个数字。

也看一下这个线程:

生成没有排序的排序随机整数?上)

可能有用。