Спасибо за статью. Когда-то тоже ломал голову над своим генератором. Вот мой вариант, может кому пригодится:
param = 0..1000. При 500 симметричное распределение. Чем ближе к 0 тем ближе чаще значения ближе к min.
int Random::irandomminmaxparam(int min, int max, int param)
{
if (param < 0) param = 0;
if (param > 1000) param = 1000;
iseed = ((iseed >> 3)*iseed * 16805 + 789221) % 2147483647;
float k = (0.05 + 1.9*param / 1000)*0.5;
float y;
float x;
if (iseed < 1073741823) {
x = 1 — iseed / 1073741823;
y = k — k*(x*x);
}
else {
x = iseed / 1073741823 — 1;
y = k + (1 — k)*(x*x);
}
return (max — min)*y + min + 0.5;
}
param = 0..1000. При 500 симметричное распределение. Чем ближе к 0 тем ближе чаще значения ближе к min.
int Random::irandomminmaxparam(int min, int max, int param)
{
if (param < 0) param = 0;
if (param > 1000) param = 1000;
iseed = ((iseed >> 3)*iseed * 16805 + 789221) % 2147483647;
float k = (0.05 + 1.9*param / 1000)*0.5;
float y;
float x;
if (iseed < 1073741823) {
x = 1 — iseed / 1073741823;
y = k — k*(x*x);
}
else {
x = iseed / 1073741823 — 1;
y = k + (1 — k)*(x*x);
}
return (max — min)*y + min + 0.5;
}