Лучший способ сделать это - сгенерировать случайное число, которое распределено поровну по определенному набору чисел, а затем применить функцию проекции к набору от 0 до 100, где проекция с большей вероятностью достигнет нужных вам чисел.
Обычно математическим способом достижения этого является построение функции вероятности нужных вам чисел. Мы могли бы использовать кривую колокольчика, но давайте для простоты вычислений просто поработаем с перевернутой параболой.
Давайте сделаем параболу такой, чтобы ее корни были равны 0 и 100, не наклоняя ее. Мы получаем следующее уравнение:
f(x) = -(x-0)(x-100) = -x * (x-100) = -x^2 + 100x
Теперь вся область под кривой между 0 и 100 представляет наш первый набор, в котором мы хотим получить числа. Там поколение совершенно случайно. Итак, все, что нам нужно сделать, это найти границы нашего первого набора.
Нижняя граница, конечно, равна 0. Верхняя граница - это интеграл нашей функции в 100, который
F(x) = -x^3/3 + 50x^2
F(100) = 500,000/3 = 166,666.66666 (let's just use 166,666, because rounding up would make the target out of bounds)
Итак, мы знаем, что нам нужно сгенерировать число где-то между 0 и 166 666. Затем нам просто нужно взять это число и спроецировать его на наш второй набор, который находится между 0 и 100.
Мы знаем, что случайное число, которое мы сгенерировали, является некоторым интегралом нашей параболы с входным значением x между 0 и 100. Это означает, что мы просто должны предположить, что случайное число является результатом F (x), и решить для x.
В этом случае F (x) является кубическим уравнением, и в форме F(x) = ax^3 + bx^2 + cx + d = 0
следующие утверждения верны:
a = -1/3
b = 50
c = 0
d = -1 * (your random number)
Решив это для х, вы получите фактическое случайное число, которое вы ищете, которое гарантированно будет в диапазоне [0, 100] и гораздо более высокую вероятность быть ближе к центру, чем края.