2017-10-01 125 views
2

PHP rand(min, max)在1和9999之間給出了幾乎所有帶4位數字的結果(因爲有四位數的數字約爲90%)。所以,如果我跑了1000次,其中約90%可能會有4位數字。具有均勻分佈數量級結果的PHP隨機INT

有沒有辦法產生一個從1到9999的隨機INT,並且輸出號碼有相同的機會有1,2,3或4位數字而不需要手動執行?

通過做手工我的意思是這樣的:

$digits = rand(1, 4); 
$num = ''; 

for($i = 0; $i < $digits; $i++){ 
    $num .= rand(0, 9); 
} 

$final = intval($num); 
+1

我想指出的是,你正在計劃做意志偏向的結果向較低的數字。例如,在0和9999之間有9000個4位數字,900個3位數字,〜90個2位數字和10個1位數字。你提出的建議將使0到9顯示25%的時間...... – serakfalcon

回答

4

所以,如果我跑了1000次,大約〜90%的人將可能有4位數字。

這正是如何均勻分佈的工作。沒有開箱即用的功能來完成你的任務,所以你必須做出一些統計魔術。

我在想什麼的是:產生0和1之間的隨機數。如果它是0和.25,生成0到9之間的另一個隨機數,如果是0.25和.5之間,產生另一個隨機數字在10到99之間,依此類推。然後,你有四分之一的機率得到每個數量級。

儘管這樣做顯然會偏向較低的數字,因爲它們的數量較少。例如,1的機會爲25%/10 = 2.5%,而1001的機會爲25%/8998 = 0.00277%

它會去是這樣的:

<?php 
$initial = rand(0, 100)/100; 
if ($initial < .25) { 
    $random = rand(0, 9); 
} 
elseif ($initial < .5) { 
    $random = rand(10, 99); 
} 
elseif ($initial < .75) { 
    $random = rand(100, 999); 
} 
elseif ($initial >= .75) { 
    $random = rand(1000, 9999); 
} 
var_dump($random); 

Demo

+0

你能否詳細說明爲什麼這會對較低的數字產生偏見?如果$ initial是隨機的,那麼經過1000次迭代後,$ initial將是〜250次的0〜0.25,〜250次.25〜5,〜250次.5〜.75和〜250次。 – nick

+0

你做自行車嗎? – soft87

+0

哦,我現在明白了,是的這是預期的功能,謝謝! – nick