2009-05-11 16 views
1

私は正常に動作PHPで、次のコード(多かれ少なかれ10件の結果にそれが実行されるたびに返されます)しました:分割確率

function GetAboutTenRandomNumbers() 
{ 
    $result = array(); 

    for ($i = 0; $i < 240; $i++) 
    { 
     if (Chance(10, 240) === true) 
     { 
      $result[] = $i; 
     } 
    } 

    echo '<pre>'; 
    print_r($result); 
    echo '</pre>'; 

    return $result; 
} 

をし、次のようにチャンス()関数が行く:

function Chance($chance, $universe = 100) 
{ 
    $chance = abs(intval($chance)); 
    $universe = abs(intval($universe)); 

    if (mt_rand(1, $universe) <= $chance) 
    { 
     return true; 
    } 

    return false; 
} 

は今、私はランダムに4次のセグメント中のもの10(平均)の結果を分割する:

  1. の確率を有する第1 10%* 10 = 1
  2. 20%の確率を有する第1 * 10 = 2
  3. 30%の確率を有する第1 * 10 = 3
  4. 40%の確率を有する1/4 * 10 = 4

すべてのセグメント(1 + 2 + 3 + 4)の合計が10に等しいので、これを行うために次の関数をコーディングしました。

function GetAboutTenWeightedRandomNumbers() 
{ 
    $result = array(); 

    // Chance * 10% 
    for ($i = 0; $i < 60; $i++) 
    { 
     if (Chance(10 * 0.1, 240) === true) 
     { 
      $result[] = $i; 
     } 
    } 

    // Chance * 20% 
    for ($i = 60; $i < 120; $i++) 
    { 
     if (Chance(10 * 0.2, 240) === true) 
     { 
      $result[] = $i; 
     } 
    } 

    // Chance * 30% 
    for ($i = 120; $i < 180; $i++) 
    { 
     if (Chance(10 * 0.3, 240) === true) 
     { 
      $result[] = $i; 
     } 
    } 

    // Chance * 40% 
    for ($i = 180; $i < 240; $i++) 
    { 
     if (Chance(10 * 0.4, 240) === true) 
     { 
      $result[] = $i; 
     } 
    } 

    echo '<pre>'; 
    print_r($result); 
    echo '</pre>'; 

    return $result; 
} 

問題は、私はGetAboutTenWeightedRandomNumbersは何十回も機能し実行したとされ、結果はGetAboutTenRandomNumbers関数によって返された結果よりもはるかに低いです。私は基本的な数学のミスをしていると確信しています、私はそれがどのように解決するのか分からないと思う。

+1

"DoIt"は非常にわかりやすい関数名ですか? – Svante

+0

当時の私の心には何も良いことはありませんでした。 =) –

+0

GetAboutTenRandomNumbers()とGetAboutTenWeightedRandomNumbers()はどうですか? – Eric

答えて

3

本当にありがとうございます!

2回目のパスでは、240回ではなく60回ずつパスするので、パスの期待値の約4分の1が得られます。それぞれを240に実行し、モジュロ60を使用して、各ループで探している値の範囲を取得します。

+0

ありがとうございます、今のように動いているようです。 =) –

2

DoIt_02()DoIt_01()と同じ数の結果を返すと期待している場合は、基本的な数学の間違いをしています。あなたのセクションの確率加重値は、加重されたチャンスが0..240セット全体に適用されないので、何も意味しません。制限された各確率を0..59,60..119の代わりに0..240で実行した場合も同様の結果が返されます。

ちなみに、Chance()という機能はわずかですが、確率試しているようですが、mt_rand(1, $universe) <= $chanceまたはmt_rand(0, $universe - 1) < $chanceのいずれかである必要があります。

+0

特にチャンス()警告のためにありがとうございます - あなたがそれを言及するまで気付かなかった。 –