2017-09-07 5 views
3

Note aux modérateurs: Ce n'est pas un devoir.PHP: Comment distribuer des valeurs à des variables avec une probabilité égale?

J'ai l'exemple suivant:

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

Je veux distribuer au hasard des points aux variables ($ a, $ b, $ c, $ d) jusqu'à atteindre zéro $ points. Ainsi, la production aléatoire prévu après l'exécution de certaines fonctions/script devrait ressembler à ceci:

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

Je pense à faire une solution simple, qui est la suivante:

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; 
} 

La fonction a 1 problème : $ a a beaucoup plus de chance de prendre plus de points (ou même tous les points) parce qu'il est premier dans la liste, alors que $ d a beaucoup plus de chances de prendre moins de points (ou pas du tout) .

Question: Comment puis-je donner à toutes les variables des chances égales de distribution?

Remarque: C'est bien si l'une des variables a pris tous les points.

+0

travail dans un tableau, et un coup d'oeil à http://php.net/array_rand – Calimero

+0

Avez-vous besoin de définir des points $ à 0 à la fin? – Manav

+0

@Manav Pas nécessairement, mais je veux distribuer tous les 10 points – evilReiko

Répondre

2

Vous pouvez sélectionner de manière aléatoire l'une des variables d'une plage et l'affecter à l'aide d'une variable variable.

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

Quelque chose comme ça?

$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

J'aime votre réponse. Mais si les points $ sont un grand nombre, comme 10000, il faudra itérer 10000 fois – evilReiko

+0

Ah, c'est là – Manav