varios valores valor una sumen sumar suman suma resultado qué que para obtener números numeros muy macro llegar importe hasta generar especifica encontrar determinado datos como combinaciones cantidad buena averiguar aleatorios c# .net random generator

c# - una - ¿Cómo puedo generar N valores aleatorios que sumen un valor predeterminado?



generar numeros aleatorios que sumen una cantidad especifica (6)

¿Qué pasa si pega los cuatro valores en una matriz, luego los baraja y luego los asigna de acuerdo a su posición ordinal? De esta forma, cada variable (gamma, theta, etc.) tiene la misma probabilidad de obtener un número alto vs bajo.

Necesito tu ayuda con un pequeño problema. Tengo cuatro etiquetas y quiero mostrar en ellas un valor aleatorio entre 0 y 100, y la suma de ellas debe ser 100.

Este es mi código:

private void randomly_Click(object sender, EventArgs e) { double alpha = 0, beta = 0, gamma = 0, delta = 0; double temp; int tempDouble; Random rnd = new Random(); alpha = rnd.Next(0, 100); temp = 100 - alpha; tempDouble = (int)temp; beta = rnd.Next(0, tempDouble); temp = 100 - (alpha + beta); tempDouble = (int)temp; gamma = rnd.Next(0, tempDouble); temp = 100 - (alpha + beta + gamma); tempDouble = (int)temp; delta = rnd.Next(0, tempDouble); temp = alpha + beta + delta + gamma; temp = 100 - temp; temp = temp / 4; alpha = alpha + temp; beta = beta + temp; gamma = gamma + temp; delta = delta + temp; cInsertion.Text = alpha.ToString(); cMoyens.Text = beta.ToString(); cInternational.Text = gamma.ToString(); cRecherche.Text = delta.ToString(); }

El problema es que le estoy dando al alfa la oportunidad de tener el biggest valor, y para delta el valor lowest bajo.

¿Hay alguna forma de darles a todos la misma posibilidad de tener un valor random real?


En lugar de generar los números individuales al azar, genere las sumas parciales, luego calcule las partes:

double alpha, beta, gama, delta = 0; var rnd = new System.Random(); var cuts = new List<double>(); cuts.Add(Math.Floor(rnd.Next(0, 101))); cuts.Add(Math.Floor(rnd.Next(0, 101))); cuts.Add(Math.Floor(rnd.Next(0, 101))); cuts.Sort(); alpha = cuts[0]; beta = cuts[1] - cuts[0]; gamma = cuts[2] - cuts[1]; delta = 100 - cuts[2];


Es un problema muy interesante. Me gusta la solución de @ Ivan_Ferić, creo, es perfecta, pero tengo otra idea:

int total = 100; Random rand = new Random(); int half = rand.next(0,total); // the line a = rand.Next(0,half); b = max - a; c = rand.Next(0,half); d = max - c;

(No probado, quizás +/- 1 debe agregarse a algunos de los vars.) Además, puede mezclar valores.

La parte interesante viene ahora. Si cambiamos "la línea":

min = <some_value> max = <another_value>; int half = rand.next(min,max);

... entonces podemos ajustar el resultado:

  • min = 0; max = 100: original;
  • min = 20; max = 80: evitar pequeños números;
  • min = 33; max = 100: fuerza dos números para que sean menos de 32.

Podrías hacer algo como esto:

double alpha = 0, beta = 0, gamma = 0, delta = 0, k = 0; Random rnd = new Random(); alpha = rnd.Next(0, 100); beta = rnd.Next(0, 100); gamma = rnd.Next(0, 100); delta = rnd.Next(0, 100); k = (alpha + beta + gamma + delta) / 100; alpha /= k; beta /= k; gamma /= k; delta /= k; cInsertion.Text = alpha.ToString(); cMoyens.Text = beta.ToString(); cInternational.Text = gamma.ToString(); cRecherche.Text = delta.ToString();

De esta forma, está diciendo: tomemos un valor aleatorio para las 4 variables, y luego las escalaremos por un factor k que hará que su suma sea 100.


Si los números que desea representan probabilidades de resultados mutuamente excluyentes, puede imaginarlos como una distribución multinomial. Como desea un vector de probabilidad aleatorio, debe tomar muestras del conjugado anterior a la distribución multinomial: la distribución de Dirichlet.

En el código, usted acaba de indicar lo que Ivan sugirió, excepto que alfa, beta, gamma y delta deberían extraerse de las distribuciones Gamma con los parámetros de forma alpha_shape, beta_shape, gamma_shape y delta_shape respectivos. (Deje que el otro parámetro de la distribución Gamma sea 1.) Estos parámetros de forma controlan las proporciones relativas esperadas.


¿Un número aleatorio real ? En resumen, no. Solo un número pseudoaleatorio.

El generador de números aleatorios opera en ciclos de reloj y es típico ver secuencias repetidas. La semilla utilizada depende de la propiedad .Tick del DateTime.Now actual ( si no recuerdo mal ). Hay muchos generadores de números aleatorios decentes y API para .Net. Recomendaría buscarlos si siente que no tiene el tiempo o el deseo de poner en marcha los suyos propios.

Se movió hasta los comentarios ya que parece más apropiado.