2017-09-07 10 views
3

司会者への注意:これは宿題ではありません。PHP:等しい確率で変数に値を分配する方法は?

私は、次の例があります。

$points = 10; 
$a = 0; 
$b = 0; 
$c = 0; 
$d = 0; 

私は$の点がゼロになるまでランダムに($、$ bのは、$ C、$ d)は変数にポイントを配布します。だから、いくつかの機能/スクリプトは次のようになります。実行した後にランダム出力を期待:

$points = 0;// Must be zero 
$a = 3; 
$b = 1; 
$c = 0; 
$d = 6; 

私が従っているシンプルなソリューションを、やってと思っています:

while($points > 0) { 
    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $a += $points_taken; 

    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $b += $points_taken; 

    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $c += $points_taken; 

    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    $d += $points_taken; 
} 

関数が1つの問題があります$ aはそれがリストの最初のものであるため、より多くのポイント(またはすべてのポイント)を取る可能性がはるかに高くなります。$ dはリストの最後であるため、ポイントを取る可能性がずっと高くなります。

質問:すべての変数に均等に分配する方法を教えてください。

:変数のいずれかがすべての点を取った場合は問題ありません。

+0

アレイ内で動作し、http://php.net/array_randをご覧ください。 – Calimero

+0

最後に$ pointsを0に設定する必要がありますか? – Manav

+0

@Manav必ずしもそうではありませんが、私は10点すべてを配布することを望みます。 – evilReiko

答えて

2

範囲から1つの変数をランダムに選択し、変数変数を使用して割り当てることができます。

$vars = range('a','d'); 
while ($points) { 
    $points_taken = mt_rand(0, $points); 
    $points -= $points_taken; 
    ${$vars[mt_rand(0, 3)]} += $points_taken; 
} 
1

このようなものはありますか?

$points = 10; 
    $a = 0; 
    $b = 0; 
    $c = 0; 
    $d = 0; 
    for($i=0; $i<$points; $i++) { 
     $rand = rand(1,4); 
     if($rand == 1) { 
      $a++; 
     } else if ($rand == 2) { 
      $b++; 
     } else if ($rand == 3) { 
      $c++; 
     } else if ($rand == 4) { 
      $d++; 
     } 
    } 
+0

私はあなたの答えが好きです。しかし、$ポイントが10000のように大きな数値であれば、10000回繰り返す必要があります – evilReiko

+0

ああ、そこそこです – Manav

関連する問題