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.