Solución:
Solo obtenga 3 números aleatorios y luego calcule un factor que sea 1 / [sum of your numbers]. Finalmente, multiplique cada uno de los números aleatorios con ese factor. La suma será 1.
En realidad, esta es una pregunta delicada. En primer lugar:
DarenLa solución de no es uniforme porque no admite tener dos números> 1/3.
SimenLa solución no es uniforme asumiendo que “elegir un número aleatorio” se extrae de una distribución uniforme, pero esto es un poco más sutil. Es al menos simétrico entre las variables (es decir, la probabilidad de [a, b, c] es el mismo que el de cualquier permutación de eso), pero favorece mucho las soluciones más cercanas a (1/3, 1/3, 1/3). Piénselo de esta manera al observar casos extremos: (1/3, 1/3, 1/3) podría provenir de cualquier (a, a, a), donde a varía de 0 a 1. (1, 0, 0), un triple igualmente válido, debe provenir de (1, 0, 0).
Una solución: El conjunto de números positivos que suman 1 forman un triángulo equilátero en tres espacios, con coordenadas (1,0,0), (0,1,0), (0,0,1). Extienda eso a un paralelogramo, por ejemplo, agregando un punto (1,1, -1) como el cuarto punto. Este doble es el área: asigne la segunda área a la primera, de modo que sea suficiente para elegir un punto aleatorio en este paralelogramo.
El paralelogramo se puede muestrear uniformemente a través de (0,0,1) + A (1,0, -1) + B (0,1, -1), donde A y B varían uniformemente de 0 a 1.
-A
Genere dos números aleatorios entre 0 y 1. Divida cada uno por 3. El tercero es la diferencia de 1 y los dos tercios aleatorios:
void Main()
{
Random r = new Random();
double d1 = r.NextDouble() / 3.0;
double d2 = r.NextDouble() / 3.0;
double d3 = 1.0 - d1 - d2;
System.Console.WriteLine(d1);
System.Console.WriteLine(d2);
System.Console.WriteLine(d3);
System.Console.WriteLine(d1 + d2 + d3);
}
esto genera lo siguiente en LINQPad:
0.0514050276878934
0.156857372489847
0.79173759982226
1