Я искал способ генерирования чисел в соответствии с гауссовским распределением и впервые нашел этот пост.Вот почему я делюсь тем, что нашел сразу после:
Существует, по крайней мере, PostGreSQL 8.4, дополнительный модуль с именем tablefunc (http://www.postgresql.org/docs/9.2/static/tablefunc.html).
Предлагает функцию normal_rand (n(например, stddev) генерирует n псевдослучайных чисел с использованием гауссовского распределения (поэтому эта функция возвращает набор значений, обычно используемых в предложении FROM). Однако, если вы установите n равным 1, его можно использовать как функциювозвращая значение, а не набор значений.
Учитывая таблицу nb10, содержащую 10 записей, два следующих запроса возвращают набор из 10 псевдослучайных чисел после стандартного распределения Гаусса (среднее = 0, stddev = 1))
SELECT normal_rand(1, 0, 1) FROM nb10;
и
SELECT * from normal_rand(10, 0, 1);
Я надеюсь, что это может помочь кому-нибудь в будущем ...: -)
Чтобы ответить на ваш вопрос конкретно, вы можете использоватьчто-то вроде:
SELECT floor(random_rand(1, 0, 1) * 250 + 125);
К сожалению, с помощью этого запроса можно получить ответ не в диапазоне [0, 249].Например, вы могли бы:
- использовать рекурсивный запрос, который я считаю немного излишним, для отбрасывания значений, не входящих в диапазон [0, 249], или
- сделать ваш выбор вцикл на ваш основной язык, принимая значение только в том случае, если оно находится в диапазоне [0, 249] или
, используя оператор по модулю, чтобы остаться в диапазоне [0, 250 [, я думаю, этоявляется лучшим решением, хотя оно слегка изменяет гауссову кривую.Вот последний запрос, который я предлагаю вам использовать (трюки по модулю / + / modulo заключаются в том, что -x по модулю y с положительным числом x дает отрицательное число в PostGreSQL, что неплохо: p):
SELECT ((floor(normal_rand(1,0,1)*250 + 125)::int % 250) + 250) % 250 as v;