如何在python中生成高度统一的随机数?

时间:2011-08-27 21:52:26

标签: python random uniform

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

每次运行都应该分开,例如:

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中的随机函数不是那么统一....谢谢!!

4 个答案:

答案 0 :(得分:5)

这不是随机的本质,它不统一吗?如果你想生成6个随机数,你希望它们中的一半低于0.5而另一半超过0.5,你应该生成0到0.5之间的3个数字,并在0.5和1之间生成3个。

答案 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.

答案 2 :(得分:1)

嗯,这有点打败了“随机”数字的目的,但Python确实支持这一点。

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

Python's documentation中的更多信息。

答案 3 :(得分:1)

了解问题的背景会有所帮助,但看起来您可能正在寻找的是low-discrepancy sequence而不是通常的伪随机数。

更具体地说,检查Halton序列是否为您提供了所需的结果。 Python实现is available