Сначала вычислите совокупную вероятность для каждой полосы (порядок сортировки произвольный; вы также можете использовать некоторый идентификатор):
SELECT Band,
CAST((SELECT sum(probability)
FROM Bands AS b2
WHERE b2.Band <= Bands.Band
) AS FLOAT) /
(SELECT sum(probability) FROM Bands)
AS CumProb
FROM Bands
ORDER BY Band;
Band CumProb
--------------- ---------------
Aerosmith 0.0823045267489
Guns N Roses 0.5061728395061
Led Zeppelin 0.8312757201646
Megadeth 0.8477366255144
Queen 1.0
(Покапоскольку в SQLite еще нет оконных функций, суммирование в Python будет более эффективным. Но для 2000 строк это не имеет большого значения.)
Затем используйте случайное число от 0 до 1, чтобы найти одно из следующих значений:строки (первые равны или больше):
WITH CPBands(Band, CumProb) AS (
SELECT Band,
CAST((SELECT sum(probability)
FROM Bands AS b2
WHERE b2.Band <= Bands.Band
) AS FLOAT) /
(SELECT sum(probability) FROM Bands)
FROM Bands
)
SELECT Band
FROM CPBands
WHERE CumProb >= ?
ORDER BY CumProb ASC
LIMIT 1;
Повторяйте столько раз, сколько необходимо, игнорируя дубликаты.