如何在Python中随机减少数字?

2024-04-26 14:02:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

很抱歉给我的原始帖子带来的混乱


Tags: 编程数字帖子办法
3条回答

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

很少有事情需要注意。从X > 0开始并在每一步中从(0,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在论文“Generating sorted lists of random numbers”中的想法,这里有一个算法,它可能是最最优的(至少我知道),并且产生均匀分布的数字:

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

注意,这个算法的复杂度仍然是O(N)(我怀疑可以降低),但是内存使用量是O(1),这些数字均匀分布在(min,max)之间,这不是很明显,而是真实的。唯一的缺点是我们必须在开始之前知道要生成多少个数字。在

也可以看看这条线:

Generating sorted random ints without the sort? O(n)

可能有用。在

比如:

from random import random
min=0
max=10
oldval=1.

while True:
  oldval=oldval*random()
  randval=min+(max-min)*oldval

相关问题 更多 >