Question

J'ai le code suivant en PHP qui fonctionne très bien (retourne plus ou moins 10 résultats à chaque fois qu'il est exécuté):

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

Et la fonction Chance () se présente comme suit:

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

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

    return false;
}

Maintenant, je veux diviser au hasard les 10 (en moyenne) des résultats dans les 4 segments suivants:

  1. le premier ayant une probabilité de 10% * 10 = 1
  2. le second ayant une probabilité de 20% * 10 = 2
  3. le troisième ayant une probabilité de 30% * 10 = 3
  4. le quatrième ayant une probabilité de 40% * 10 = 4

Comme vous pouvez le voir la somme de tous les segments (1 + 2 + 3 + 4) est égale à 10, donc j'ai codé la fonction suivante pour le faire.

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

Le problème est que je suis à court fonctionnent les GetAboutTenWeightedRandomNumbers des dizaines de fois et le résultat est beaucoup plus faible que le résultat retourné par la fonction GetAboutTenRandomNumbers. Je suis sûr que je fais une erreur mathématique fondamentale, je pense où mais je ne sais pas comment le résoudre.

Était-ce utile?

La solution

Vous êtes en effet!

Dans votre deuxième passe, vous donnant 60 valeurs chaque passe, au lieu de 240, de sorte que vous obtiendrez environ un quart des valeurs attendues dans ce passage. Exécutez chacun à 240 et utiliser un modulo 60 pour obtenir la plage de valeurs que vous recherchez dans chaque boucle.

Autres conseils

Si vous vous attendez à revenir sur les DoIt_02() le même nombre de résultats que DoIt_01(), alors oui, vous faites une erreur mathématique fondamentale. Les poids de probabilité de vos sections Rajouté à 10 ne signifie rien parce que les chances pondérées ne sont pas appliquées à l'ensemble du jeu 0..240. Il retournerait des résultats similaires si vous exécutiez chaque probabilité limitée sur 0..240 au lieu de 0..59, 60..119, etc.

Par ailleurs, votre fonction est légèrement Chance() en ce que pour obtenir les probabilités que vous semblez essayer de, il devrait être soit ou mt_rand(1, $universe) <= $chance mt_rand(0, $universe - 1) < $chance.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top