Distribución Gaussiana en probabilidad [Unity]

Hipnos

Hola, tengo una duda.

Hasta ahora he hecho los números aleatorios con Random.Range(-1,1), por ejemplo. Pero esto me genera una distribución de la probabilidad plana en todo el conjunto.

Mi interés es una función gaussiana de probabilidad, de tal manera que los valores centrales sean mucho más probables que los externos.

Quizá multiplicando los valores de un rango aleatorio cualquiera por una semicampana gaussiana entre 0 y 1 se podría hacer para probabilidades centradas en 0... Aunque no lo veo claro.

¿Alguien ha hecho algo así?

Muchas gracias.

eZpit

Lo que estás buscando es una transformación Box-Muller:
http://en.wikipedia.org/wiki/Box_Muller_transform

2 2 respuestas
Rebollo

Con #2 te vale pero, sin tener mucha idea, me extraña que no este implementada una distribución normal

Deoxys

puedes hacer algo del estilo de

num=0
for i in range(100): num+=random.choice[0,1]

Tirar un dado varias veces (O varios dados una vez) se utiliza en juegos de rol a la hora de crear personajes porque es una manera fácil de conseguir una distribución gaussiana. Si unity no tiene nada por defecto puedes usar eso

3 1 respuesta
Hipnos

#2 Pero esto no está implementado en Unity, ¿no?

Aunque por lo que veo se podría implementar con una función Random simple.

1 respuesta
eZpit

#5 Pero que no os asusten las cosas tanto, que es leer 2 formulas y hacer un script.

En cualquier caso no eres el primero, toma implementación en C# de los foros oficiales... :
http://answers.unity3d.com/questions/421968/normal-distribution-random.html

#4 Que cuando no te quedan más recursos (vease cuando tienes unos dados) recurras a algo así esta bien. Pero que teniendo un ordenador capaz de realizar calculos hagas semejante chapuza, pues no xD

1 2 respuestas
Hipnos

#6 Muchísimas gracias! :)

Deoxys

#6 No sé en qué lenguaje trabaja ni qué recursos tiene disponibles, así que doy una solución para todo.

Hipnos

Si a alguien lo interesa, he migrado los códigos a JavaScript:
http://pastebin.com/6D6Dhw9m

Finalmente quedan dos funciones:

GaussianFloat() ->Da un número correspondiente a una distribución normal.
GaussianRange(minValue : float, maxValue : float) -> Da un número con una distribución normal entre esos dos valores, centrado en el punto medio.

Gracias a todos por colaborar!

Usuarios habituales

  • Hipnos
  • Deoxys
  • eZpit
  • Rebollo