Su pregunta menciona un algoritmo ineficiente que genera cuatro números independientes y uniformemente distribuidos entre los enteros de 0 a 100, y se repite hasta que su suma sea 100. Voy a asumir que está satisfecho con la distribución generada por ese algoritmo, pero no está satisfecho con el rendimiento.
Antes de analizar cómo producir la distribución de manera más eficiente, primero hay que entender cómo es la distribución.
Por construcción, es fácil ver que cada uno de a, b, c y d están distribuidos de manera idéntica. También es fácil ver que no son independientes debido a que su suma es constante. Lo que ya sabemos sobre su distribución es que tiene un valor mínimo de 0, un valor máximo de 100 y un valor promedio de 25. El promedio se sigue del hecho de que su suma tiene que ser 100 en promedio.
Esto descarta una distribución uniforme de los números individuales (y de hecho descarta cualquier distribución simétrica). Esto significa que su algoritmo más eficiente, que genera a uniformemente, producirá una distribución diferente.
Hacia un algoritmo eficiente
Si definimos X = a+b y preguntamos cómo es la distribución de X”, encontraremos algo interesante. La distribución claramente no depende de qué par de los cuatro números sumamos. Entonces los seis pares posibles son distribuidos de manera idéntica, pero no son independientes. Esta distribución tiene un mínimo de 0, un máximo de 100 y un promedio de 50. Y la distribución tiene que ser simétrica porque X y 100-X$ están distribuidos de manera idéntica.
No es inmediatamente obvio si la distribución de X” es uniforme en los enteros de 0 a 100. Sin embargo, si la distribución de X” se puede generar eficientemente, entonces la distribución de los cuatro números se puede generar eficientemente de la siguiente manera:
- Genera X
- Elige a de manera uniforme al azar en el rango 0 a $X”
- Sea b := X-a
- Elige c de manera uniforme al azar en el rango 0” a 100-X$
- Sea $d := 100-X-b’/li>
La distribución de $X”
El algoritmo original produciría X como la suma de dos números uniformemente aleatorios en el rango de 0 a 100, pero descartaría cualquier resultado donde la suma total fuera diferente de 100.
Un algoritmo diferente podría generar X y Y” de acuerdo con esta distribución y descartar el resultado si X+Y \neq 100”. Esto es útil porque la generación de X” y Y” se puede simplificar.
Si X” es mayor que 100, se puede descartar inmediatamente. Podemos analizar fácilmente cuál es la nueva distribución antes de verificar la suma de X” y Y”. La probabilidad inicial de un resultado x \in [0; 100] sería \frac{1+x}{10000}, pero cuando descartamos los valores mayores que 100, la probabilidad será \frac{1+x}{5050}
La probabilidad de generar inmediatamente X=x y Y=100-x se puede entonces obtener como \frac{1+x}{5050} \cdot \frac{1+(100-x)}{5050} = \frac{(1+x)(101-x)}{5050^2}. La probabilidad de P(X=x \wedge Y=100-x) se puede calcular escalando el denominador de manera que la suma sea $1”
En este punto queda claro que X” no está distribuido uniformemente. Pero también nos da una forma de construir X” directamente.
Para generar la distribución de X” directamente, necesitamos una fórmula para P(X \leq x)”. Esta fórmula será:
$$P(X \leq x) = \frac{\Sigma_{i=0}^x (1+x)(101-x)}k = \frac{-2x^3 + 297x^2 + 905x + 606}{6k}”
Como sabemos que P(X \leq 100) = 1, podemos deducir que k=176851
Con esto, el algoritmo se vuelve:
- Elige r de manera uniforme al azar en los enteros [0;176850]
- Toma el valor más pequeño de x tal que $\Sigma_{i=0}^x (1+x)(101-x) \geq r”
- Elige a de manera uniforme al azar en el rango 0 a $x”
- Sea $b := x-a”
- Elige c” de manera uniforme al azar en el rango 0 a 100-x”
- Sea $d := 100-x-b”
1 votos
Supongo que estamos hablando de números enteros no negativos (¿se incluye el cero?), ¿verdad? ¿Y "un número aleatorio de 100" significa un número en [0...100] con probabilidad uniforme?
1 votos
Sí, números no negativos, de 0 a 100, con probabilidad uniforme.
1 votos
Si cada uno de los cuatro números debe ser uniformemente aleatorio en el rango [0..100], entonces la suma será 4⋅50 en promedio. Pero 4⋅50≠100. Así que diría que la distribución deseada no está bien definida. Elegir cuatro enteros de forma independiente y uniformemente aleatoria de [0..100] y repetir hasta que la suma sea 100 producirá una distribución bien definida, los cuatro números serán distribuidos de manera idéntica, pero no uniformemente de [0..100]. ¿Es esa la distribución que estás buscando? No especificaste que los números tenían que ser enteros.
0 votos
Creo que el método sugerido por ajq88 también funcionaría y daría la misma imparcialidad que el método de @Thomas siempre y cuando se tenga cuidado de tomar una permutación aleatoria del cuádruplo resultante de 4 números (asumiendo que el orden importa, ya que entonces las preocupaciones sobre "la ventana de elección siendo más amplia para el primer número y reduciéndose progresivamente para los demás, lo que indica un sesgo" son válidas).
0 votos
Al responder a una Pregunta antigua, debes resaltar qué nueva información estás contribuyendo para responder al problema original. Una lectura cuidadosa te mostrará que no has respondido al problema planteado por el OP, es decir, si su algoritmo propuesto es imparcial.