Estaba buscando una forma de generar números según una distribución gaussiana y primero encontré esta publicación. Es por eso que comparto lo que he encontrado justo después:
Hay, desde al menos PostGreSQL 8.4, un módulo adicional llamado tablefunc (http://www.postgresql.org/docs/9.2/static/tablefunc.html).
Propone una función normal_rand (n, mean, stddev) generando n números pseudoaleatorios utilizando una distribución gaussiana (por lo que esta función devuelve un conjunto de valores, normalmente utilizados en la cláusula FROM). Sin embargo, si configura n como 1, se puede usar como una función que devuelve un valor y no un conjunto de valores.
Considerando un NB10 tabla que contiene 10 registros, los dos siguientes consultas devuelven un conjunto de 10 números pseudo-aleatorios siguiendo una distribución gaussiana estándar (media = 0, STDDEV = 1)
SELECT normal_rand(1, 0, 1) FROM nb10;
y
SELECT * from normal_rand(10, 0, 1);
espero que esto podría ayudar a cualquier persona en el futuro ... :-)
Para responder a su pregunta en concreto, podría utilizar algo como:
SELECT floor(random_rand(1, 0, 1) * 250 + 125);
Desafortunadamente, es posible obtener una respuesta que no esté en el rango [0, 249] con esta consulta.Usted podría, por ejemplo:
- uso de una consulta recursiva, que me parece un poco exagerado, para descartar los valores no en el rango [0, 249], o
- hacer su selecto en un bucle en su lengua de acogida , aceptando el valor solo si está en el rango [0, 249] o
use el operador de módulo para permanecer en el [0, 250 [rango, creo que esta es la mejor solución, aunque altera levemente el gaussiano curva. Aquí está la consulta final le sugiero que utilice (los/+/trucos de módulo de módulo es porque -x módulo y con xa número positivo da un número negativo en PostgreSQL, que no es una mala cosa: p):
SELECT ((floor(normal_rand(1,0,1)*250 + 125)::int % 250) + 250) % 250 as v;
¿Por qué asumes que la popularidad o el ranking tienen una distribución de Gaussion? – wildplasser
Puede calcular cualquier distribución usando el PDF de esa distribución usando RAND (que produce valores entre 0 y 1, ¿verdad?). Para la distribución gaussiana, eso sería 1/2 (1 + erf (x-mu)/sqrt (2sigma^2)) - ver http://en.wikipedia.org/wiki/Normal_distribution –
@wildplasser: porque esa ley parece bastante bueno para lo que intento modelar. ¡Admito que podría haber sido cualquier otro! – SCO