2013-01-10 168 views
-1

我真的爲這個問題感到羞愧,但我沒有時間進行修改。也不是英語母語的人,所以請原諒我缺乏數學詞彙。隨機變量的概率

我正在編寫一個程序,需要將變量的概率分配給變量,然後隨機選擇一個變量。

例子:

想象一下,我有我的硬幣,我想的大概70%的頭和30%分配給尾巴。當我拋出它時,我希望有70%的機會出現頭像和30%的尾巴。

一個愚蠢的做法是創建一個單元格數組,在30中插入頭部70個單元格和尾部。隨機化它們並隨機選擇一個。

編輯1:我也想指出,我不僅限於2個變量。例如,假設我有3個字符可以在(*,\ $,#)之間進行選擇,並且我希望爲它們中的每一個分配* = 30%,\ $ = 30%和#= 40%。

這就是爲什麼我不想使用隨機函數,並想看看它是如何在數學上完成的。

+2

似乎與到http://計算器。com/questions/445235/generate-random-results-by-weight-in-php –

+0

這只是一個例子。例如,如果我有三個變量,下面的所有答案都會失敗。 A = 10,B = 10和C = 80的概率 – thedethfox

+0

這不是一個值得感到羞愧的問題。唯一不好的問題是沒有被問到的問題 –

回答

1

下面是一個簡單的函數來計算加權蘭德:

<?php 
function weightedRand($weights, $weight_sum = 100){ 
    $r = rand(1,$weight_sum); 
    $n = count($weights); 
    $i = 0; 
    while($r > 0 && $i < $n){ 
     $r -= $weights[$i]; 
     $i++; 
    } 
    return $i - 1; 
} 

這個函數接受數組。例如array(30,70)將有30%的機會獲得0和70%的機會獲得1。這應該適用於多個權重。

其原理是用權重減去生成的隨機數直到它小於或等於零。

Demo with 30%:70%
Demo with 20%:30%:50%

+0

甜。非常感謝這一個。 +1和最佳答案。 – thedethfox

2

你想要另一種方式嗎?大多數rand函數都會從[0,1)中產生一個小數。對於30%,檢查生產數量小於0.3

但請注意,如果你實際測試所感知的「隨機性」,它不是真正的隨機..

在PHP中,你可以使用蘭特(0,99) (整數而不是雙倍,而不是0.3)。 PHP rand函數是一個封閉的區間(包括端點)

function randWithWeight($chanceToReturnTrue) { // chance in percent 
    return rand(0, 99) < $chanceToReturnTrue; 
} 

編輯:關於感知隨機性的說明。一些數學,因爲你說你從數學來...從0-99生成數字,將它們添加到數組。當數組包含重複時停止。它通常需要大約20次傳球(我在重複之前得到3-21次傳球,10次以上)。所以這不是你所期望的「隨機」。雖然(我知道我要走),請看birthday problem。它比看起來「更隨機」。

+0

不知道你對「隨機感知」位有什麼瞭解;對於OP的問題,僞隨機/隨機之間的任何區別都是無關緊要的。 – bnaul

+0

他來自數學方面,可能想要一個「更好」的隨機生成器。 – Raekye

+0

+1。但是,如果我有3個變量,這將失敗。其中兩個有類似的概率 – thedethfox

1

如果你想30%的概率只是做

if(rand(1,100) <= 30){ 
    // execute code 
} 
+0

+1。但是,如果我有3個變量,這將失敗。其中兩個有類似的概率 – thedethfox

1

一種方法是

$r=rand(1,100); 
if($r<70) 
{ 
    echo "Head"; 
} 
else 
{ 
    echo "Tail"; 
} 
+0

+1。但是,如果我有3個變量,這將失敗。其中兩個有類似的概率 – thedethfox

+1

謝謝@thedethfox但在您的原始問題中沒有提及3個變量的可能性。這只是一個正確的方向,而不是最終的解決方案。歡呼:) –