Pregunta

Tengo el siguiente código en PHP que funciona bien (devuelve más o menos 10 resultados cada vez que se ejecuta):

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

Y la función de probabilidad () es la siguiente:

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

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

    return false;
}

Ahora, quiero dividió aleatoriamente esos 10 (en promedio) resulta en los 4 segmentos siguientes:

  1. la primera uno que tiene una probabilidad de 10% * 10 = 1
  2. el segundo que tiene una probabilidad de 20% * 10 = 2
  3. la tercera uno que tiene una probabilidad de 30% * 10 = 3
  4. el cuarto uno que tiene una probabilidad de 40% * 10 = 4

Como se puede ver la suma de todos los segmentos (1 + 2 + 3 + 4) es igual a 10, por lo que ha codificado la siguiente función para hacer esto.

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

El problema es que he ejecutar las GetAboutTenWeightedRandomNumbers funcionan decenas de veces y el resultado es mucho más bajo que el resultado devuelto por la función GetAboutTenRandomNumbers. Estoy seguro de que estoy cometiendo un error fundamental de matemáticas, donde sospecho, pero no sé cómo resolverlo.

¿Fue útil?

Solución

De hecho eres!

En el segundo paso, que está dando 60 valores cada paso, en lugar de 240, por lo que obtener alrededor de una cuarta parte de los valores esperados en que pase. Ejecutar cada una a 240 y utilizar un módulo 60 para obtener el rango de valores que está buscando en cada bucle.

Otros consejos

Si usted está esperando para volver DoIt_02() aproximadamente el mismo número de resultados como DoIt_01(), entonces sí, estás cometiendo un error fundamental matemáticas. Sus pesos de probabilidad secciones Sumado a 10 significa nada, porque las probabilidades ponderadas no se aplican a todo el conjunto de 0..240. Sería devolver resultados similares si se ejecutaba cada probabilidad restringido en lugar de 0..240 0..59, 60..119, etc.

A propósito, su función es Chance() ligeramente fuera porque, para obtener las probabilidades que parecen estar tratando de, debe ser bien mt_rand(1, $universe) <= $chance o mt_rand(0, $universe - 1) < $chance.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top