Najlepszym sposobem na to jest wygenerowanie liczby losowej, która jest równomiernie rozłożona na pewien zestaw liczb, a następnie zastosowanie funkcji projekcji do zbioru od 0 do 100, w którym prawdopodobieństwo, że projekcja uderzy w pożądane liczby.
Zazwyczaj matematycznym sposobem osiągnięcia tego jest wykreślenie funkcji prawdopodobieństwa liczb, które chcesz. Możemy użyć krzywej dzwonowej, ale dla łatwiejszego obliczenia wystarczy pracować z odwróconą parabolą.
Zróbmy parabolę w taki sposób, aby jej korzenie były równe 0 i 100 bez wypaczania. Otrzymujemy następujące równanie:
f(x) = -(x-0)(x-100) = -x * (x-100) = -x^2 + 100x
Teraz cały obszar pod krzywą od 0 do 100 jest reprezentatywny dla naszego pierwszego zestawu, w którym chcemy wygenerować liczby. Tam generacja jest całkowicie losowa. Wszystko, co musimy zrobić, to znaleźć granice naszego pierwszego zestawu.
Dolna granica to oczywiście 0. Górna granica jest całką naszej funkcji przy 100, czyli
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)
Wiemy więc, że musimy wygenerować liczbę pomiędzy 0 a 166 666. Następnie musimy po prostu wziąć tę liczbę i rzutować ją do naszego drugiego zestawu, który wynosi od 0 do 100.
Wiemy, że liczba losowa, którą wygenerowaliśmy, jest jakąś całką naszej paraboli z wejściem x od 0 do 100. Oznacza to, że po prostu musimy założyć, że liczba losowa jest wynikiem F (x) i rozwiązać dla x.
W tym przypadku F (x) jest równaniem sześciennym, aw postaci F(x) = ax^3 + bx^2 + cx + d = 0
prawdziwe są następujące stwierdzenia:
a = -1/3
b = 50
c = 0
d = -1 * (your random number)
Rozwiązanie tego dla x daje rzeczywistą liczbę losową, której szukasz, która z pewnością mieści się w przedziale [0, 100] i znacznie większe prawdopodobieństwo, że znajdzie się bliżej środka niż krawędzi.