Найкращий спосіб зробити це - генерувати випадкове число, яке розподіляється порівну в певному наборі чисел, а потім застосувати функцію проекції до множини між 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)
Якщо вирішити це для x, ви отримаєте фактичне випадкове число, яке ви шукаєте, яке гарантовано знаходиться в діапазоні [0, 100] і набагато більша ймовірність бути близьким до центру, ніж ребра.