У мене була така ж проблема. Враховуючи набір, де кожен елемент має ймовірність і чиї ймовірності елементів дорівнюють одному, я хотів ефективно зробити вибірку, тобто не сортуючи нічого і не повторюючи повторення набору .
Наступна функція малює найнижчу з рівномірно розподілених випадкових чисел в інтервалі . Нехай - випадкове число з .N[a,1)r[0,1)
next(N,a)=1−(1−a)⋅r√N
За допомогою цієї функції можна намалювати висхідний ряд з рівномірно розподілених випадкових чисел у [0,1). Ось приклад з :(ai)NN=10
a0=next(10,0)
a1=next(9,a0)
a2=next(8,a1)
…
a9=next(1,a8)
Малюючи цей висхідний ряд рівномірно розподілених чисел, повторіть набір ймовірностей який представляє ваш арбітражний (поки скінченний) розподіл. Нехайбути итератор і . Після малювання , збільшення нулю або більше разів, поки . Потім додайте до свого зразка і продовжуйте малювати .(ai)P0≤k<|P|pk∈Paik∑p0…pk>aipkai+1
Приклад із набором оп та розміром вибірки :{(1,0.04),(2,0.5),(3,0.46)}N=10
i a_i k Намалюй суму
0 0,031 0 0,04 1
1 0.200 1 0,54 2
2 0,236 1 0,54 2
3 0.402 1 0.54 2
4 0,488 1 0,54 2
5 0,589 2 1,0 3
6 0,625 2 1,0 3
7 0,638 2 1,0 3
8 0,738 2 1,0 3
9 0,942 2 1,0 3
Зразок:(1,2,2,2,2,3,3,3,3,3)
Якщо вам цікаво функцію : це обернена ймовірність того, що одне з рівномірно розподілених випадкових чисел лежить в інтервалі з .nextN[a,x)x≤1