Еще проще, в зависимости от скорости вашего генератора случайных чисел, вы можете просто сгенерировать два значения и усреднить их.
Или, еще проще, где X является результатом ГСЧ, во- первых double y = double(1/x);
, x = y*[maximum return value of rng];
. Это будет взвешивать числа в геометрической прогрессии до более низких чисел.
Создайте и усредните большее количество значений, чтобы увеличить вероятность приближения значений к центру.
Конечно, это работает только для стандартных распределений кривых колокольчиков или их «свернутых» версий *, но с быстрым генератором это может быть быстрее и проще, чем использование различных математических функций, таких как sqrt.
Вы можете найти все виды исследований по этому вопросу для кривых колокольчиков. На самом деле, Anydice.com является хорошим сайтом, который генерирует графики для различных методов бросания костей. Хотя вы используете ГСЧ, предпосылка такая же, как и результаты. Так что это хорошее место для просмотра дистрибутива еще до того, как его кодировать
* Кроме того, вы можете «сложить» распределение результатов по оси, взяв ось и вычтя усредненный результат, а затем добавив ось. Например, вы хотите, чтобы более низкие значения были более распространенными, и допустим, что вы хотите, чтобы 15 было вашим минимальным значением, а 35 - вашим максимальным значением, диапазон 20. Таким образом, вы генерируете и усредняете вместе два значения с диапазоном 20 ( в два раза больше желаемого диапазона), что даст колокольчик с центром в 20 (мы вычитаем пять в конце, чтобы сместить диапазон с 20 до 40, с 15 до 35). Возьмите сгенерированные числа X и Y.
Финальный номер,
z =(x+y)/2;// average them
If (z<20){z = (20-z)+20;}// fold if below axis
return z-5;// return value adjusted to desired range
Если ноль - ваш минимум, даже лучше, сделайте это вместо этого,
z= (x+y)/2;
If (z<20){z = 20-z;}
else {z = z - 20;}
return z;