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
我将生成一个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”中的想法,这里有一个算法,它可能是最最优的(至少我知道),并且产生均匀分布的数字:
注意,这个算法的复杂度仍然是
O(N)
(我怀疑可以降低),但是内存使用量是O(1)
,这些数字均匀分布在(min,max)
之间,这不是很明显,而是真实的。唯一的缺点是我们必须在开始之前知道要生成多少个数字。在也可以看看这条线:
Generating sorted random ints without the sort? O(n)
可能有用。在
比如:
相关问题 更多 >
编程相关推荐