2011-08-27 110 views
1

在某种程度上,我需要一个随机函数,可以生成高度统一的数字,例如,当我说[5,5]时,我运行这个函数10次,我想有5个小于0.5的数字,其他5个数字大于0.5。如何在python中生成高度一致的随机数字?

每个运行应分开,如:

for i in range(0,10): 
    rnd=random_function([6,3,1]) 
    print rnd 

具有运行此函数为十次后,然后我有6号是小于0.6时,3个数字是0.6和0.9之间,和1号是在0.9到1.

有谁知道我该怎么做?因为python里面的随机函数不是那种统一的....谢谢!

+3

即使是最好的RNG也不会总是给你想要的东西。如果您想要某个给定范围内的数字,请调用该范围内的RNG。均匀分布是随着生成的数字接近无限而发生的。预计10个随机数的一致性是你不能总是依靠的。 –

+0

只有在极限内才能保持一致;如果它总是统一的,那不会是随机的,是吗? –

+1

你应该更好地解释你想要做的事情。如果你想要一致性,你不需要随机性。使用随机函数,你真的不介意结果,提供一个范围。在第一个例子中,你需要两组不同的随机数。 –

回答

2

你所要求的是随机的;事实上,它是相当结构化的。随机数据的要点是它没有结构化:你不能说什么值将是什么,只有他们将平均

,您仍然可以做你想做的,不过:只要指定你想你的号码落入范围。

>>> def random_function(*args): 
...  n = sum(args) 
...  bottom = 0 
...  for m in args: 
...    for _ in range(m): 
...      yield random.uniform(bottom, bottom + m/n) 
...    bottom += m/n 
... 
>>> list(random_function(6,3,1)) 
[0.1849778317803791, 0.2779140519434712, 0.08380168147928498, 0.5477412922676888 
, 0.5158697440011519, 0.5535466918038039, 0.8046993690361345, 0.714614514522802, 
0.7102988180048052, 0.9608096335125095] 
>>> list(random_function(6,3,1)) 
[0.29313403848522546, 0.5543469551407342, 0.14208842652528347, 0.344464024804118 
7, 0.3168266508239002, 0.5956620829410604, 0.673021479097414, 0.7141779120687652 
, 0.7783099010964684, 0.9103924993423906] 

说明:

鉴于(6,3,1),解决他们的总和(10)。我们需要0到6/10之间的六个数字,6/10和6/10之间的三个数字+3/10,以及6/10 + 3/10和6/10 + 3/10 + 1/10之间的一个数字。我们可以通过调用

random.uniform(0, 6/10) six times, 
random.uniform(6/10, 9/10) three times, and 
random.uniform(9/10, 1) once. 
5

这不是随机的本质,它不统一?如果你想生成6张随机数,你想有一半是在0.5以下,而另一半将超过0.5,你应该在0和0.5之间产生3个数字,并产生3个和1 0.5

1

好,这有点违背了“随机”数字的目的,但Python确实支持这一点。

作为random模块(import random)的一部分,则可以使用random.uniform(a,b)代替random.random()其中ab是浮点的范围内。在Python's documentation

更多信息。

+1

感谢您的信息。我试过了,但看起来像random.uniform(a,b)没有太多的区别比random.random()... :( – Kevin

1

这将有助于了解你的问题的背景下产生这些,但现在看来,你可能会寻找有low-discrepancy sequence真是让人不是通常的伪随机数。

更具体地说,检查Halton序列是否能给你想要的结果。 Python实现is available