5.11. Losowy wybór z listy zdarzeń o różnych prawdopodobieństwach
Problem
Chcemy dokonywać wielokrotnego wyboru elementów z kolekcji w taki sposób, by częstotliwość wyboru danego elementu odpowiadała zadanemu a priori prawdopodobieństwu.
Rozwiązanie
Należy utworzyć hasz, w którym poszczególne elementy mapowane są w odpowiadające im względne prawdopodobieństwa wyboru, wyrażone liczbami całkowitymi:
def choose_weighted(weighted) sum = weighted.inject(0) do |sum, item_and_weight| sum += item_and_weight[1] end target = rand(sum) weighted.each do |item, weight| return item if target <= weight target -= weight end end
Jeżeli na przykład wszystkie elementy mapowane będą w wartość 1
, będzie to oznaczać, że każdy z nich może zostać wybrany ...
Get Ruby. Receptury now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.