2009-10-07 10 views
5

Necesito un generador de números aleatorios que selecciona números sobre un rango específico con un promedio programable.Implementación no uniforme del generador de números aleatorios?

Por ejemplo, tengo que elegir los números entre 2 y 14 y necesito el promedio de los números al azar para ser 5.

utilizo generadores de números aleatorios mucho. Por lo general, solo necesito una distribución uniforme.

Ni siquiera sé a qué llamar este tipo de distribución.

Gracias por cualquier ayuda o idea que pueda proporcionar.

+9

¿Estás seguro de que ya ha proporcionado suficiente información acerca de la distribución? Creo que el valor medio no es suficiente. Considere este ejemplo: digamos que generamos números aleatorios de '{0, 1, 2}' con 1 mean. Ahora eche un vistazo a estos dos generadores: 'Generator1 (0: 40%, 1: 20%, 2: 40%)', 'Generator2 (0: 10%, 1: 80%, 2: 10%)'. Para ambos, el resultado promedio sería 1. –

+1

Casi duplicado: http://stackoverflow.com/questions/977354/generating-non-uniform-random-numbers. Y las distribuciones pseudoaleatorias no planas son un tema estándar que se ha abordado más de una vez en SO. Brinde más información y podemos indicarle la dirección correcta. – dmckee

+0

Si la distribución de destino no se representa fácilmente con un PDF integrable, consulte: http://stackoverflow.com/questions/423006/how-do-i-generate-points-that-match-a-histogram – dmckee

Respuesta

0

Mi primera idea sería:

  • generar números en el rango 0..1
  • escala a la gama -9..9 (x-0,5; x * 18)
  • cambio rango de 5 -> 14 -4 .. (añadir 5)
  • truncar el rango de 2..14 (descartar los números < 2)

que debe darle un número en el rango que desea.

+0

Pero a medida que descarta los números <2, su promedio se mueve hacia arriba, alejándose de 5 ¿no es así? –

6

Es posible que pueda utilizar un binomial distribution, si está satisfecho con la forma de esa distribución. Establecer n = 12 yp = 0.25. Esto le dará un valor entre 0 y 12 con una media de 3. Simplemente agregue 2 a cada resultado para obtener el rango y significa que está buscando.

Editar: En cuanto a la implementación, es probable que pueda encontrar una biblioteca para su idioma elegido que soporta distribuciones no uniformes (he written one myself for Java).

Una distribución binomial se puede aproximar con bastante facilidad utilizando un RNG uniforme. Simplemente realice n ensayos y registre el número de éxitos. Entonces, si tienes n = 10 yp = 0.5, es como lanzar una moneda 10 veces seguidas y contar el número de caras. Para p = 0,25 simplemente genere valores distribuidos uniformemente entre 0 y 3 y solo cuente ceros como éxitos.

Si desea una implementación más eficiente, hay un ingenioso algoritmo oculto en los ejercicios del volumen 2 de Knuth's The Art of Computer Programming.

+0

el enlace a ["(He escrito uno para Java).]] (Https://uncommons-maths.dev.java.net/) no está disponible – yishaiz

+1

@yishaiz Lo acabo de actualizar. –

0

Necesita un generador de números aleatorios distribuido/ponderado. Here's a reference para comenzar.

3

No ha dicho qué distribución está buscando. En cuanto a su ejemplo específico, una función que produjo una distribución uniforme entre 2 y 8 satisfaría sus requisitos, estrictamente como los ha escrito :)

+0

Creo que el OP tiene la intención de que los valores del 9-14 tengan alguna probabilidad de ser seleccionados. – fbrereto

1

Si desea una distribución no uniforme del número aleatorio, entonces puede tener para implementar algún tipo de mapeo, p. ej .:

// returns a number between 0..5 with a custom distribution 
int MyCustomDistribution() 
{ 
    int r = rand(100); // random number between 0..100 
    if (r < 10) return 1; 
    if (r < 30) return 2; 
    if (r < 42) return 3; 
    ... 
} 
1

Puede crear un PRNG no uniforme a partir de uno uniforme. Esto tiene sentido, como se puede imaginar tomando un PRNG uniforme que devuelva 0,1,2 y cree un PRNG nuevo y no uniforme devolviendo 0 para los valores 0,1 y 1 para el valor 2.

Hay más en ello si desea características específicas sobre la distribución de su nuevo PRNG no uniforme. Esto está cubierto en the Wikipedia page on PRNGs, y el Ziggurat algorithm se menciona específicamente.

Con esas pistas, debería poder buscar algún código.

1

Basado en el Wikipedia sub-article sobre generadores no uniformes, parecería que desea aplicar la salida de un generador de números pseudoaleatorios uniforme a una distribución de área que cumpla con la media deseada.

0
Assign all numbers equal probabilities, 

mientras currentAverage no es igual a intendedAverage (whithin posible margen)

pickedNumber = pick one of the possible numbers (at random, uniform probability, if you pick intendedAverage pick again) 

if (pickedNumber is greater than intendedAverage and currentAverage<intendedAverage) or (pickedNumber is less than intendedAverage and currentAverage>intendedAverage) 

    increase pickedNumber's probability by delta at the expense of all others, conserving sum=100% 

else 

    decrease pickedNumber's probability by delta to the benefit of all others, conserving sum=100% 

end if 

delta=0.98*delta (the rate of decrease of delta should probably be experimented with) 

final, mientras que

Cuestiones relacionadas