2014-04-05 2 views
2

Скажем, у меня есть метод, который принимает массив объектов, каждый из которых в процентном атрибута, управляющего как часто элемент возвращается методомВыбор случайного объекта в массиве, исходя из процентов

Ie. Я хочу иметь возможность добавить объект к массиву E с процентным значением 0,20 и вернуть его примерно каждый пятый вызов метода. Какой был бы лучший способ реализовать такой метод?

PS. Не просто иметь массив из 5 объектов и выбрать один случайным образом

+0

вопрос не ясен, если возможно попробовать поставить некоторые примеры, которые могли бы продемонстрировать вам нужно. –

ответ

3

Может быть, что-то вроде этого?

class Sample 

    def initialize(e) 
    @E = e 
    @sums = [] 
    @E.each_with_index { |x, i| @sums << (@sums.last || 0) + @E[i][:pct] } 
    end 

    def draw 
    rand = Random.rand() 

    for i in 0..(@sums.length-1) 
     return @E[i][:el] if rand <= @sums[i] 
    end 
    end 

end 

Пример

ss = Sample.new(e = [{el: "hello", pct: 0.3}, {el: "world", pct: 0.3}, {el: "goodbye", pct: 0.4}]) 
# Draw "hello" with 30%, "world" with 30%, "goodbye" with 40% probability, respectively 
results = [] 
10_000.times { results << ss.draw } 
e.map { |x| { x[:el] => results.count { |y| y == x[:el] }.to_f/results.length } }.reduce(:merge) 
# observed percentages of 10,000 draws 
# {"hello"=>0.2938, "world"=>0.3046, "goodbye"=>0.4016} 
Смежные вопросы