2011-08-27 111 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