LoginSignup
13
10

More than 5 years have passed since last update.

重み付き乱択アルゴリズム

Posted at

Rubyの勉強してます。

会社で昼休みに昼飯を選ぶアプリを作っているのですが、
DBから取得した昼飯リストの中から、なんかいい方法で
選択できないかなー? と情報を漁っていると

algorithm - 重みをつけて乱択する

弾さんのブログで良い情報があったので、Rubyで書いてみました。

make_random_picker.rb
#! ruby
class DUP
    def initialize(name, age)
        @name  = name
        @age = age
    end
    attr_accessor :name,:age
end

def make_random_picker(dup)
    dup.sort{|a,b| a.age <=> b.age}
    age_sum = 0
    dup.each do |d|
        age_sum +=  d.age
    end
    dup.each do |d|
        d.age /= age_sum
    end
    r = rand()
    sum = 0
    dup.each do |d|
        sum += d.age
        return d if r < sum
    end
    return dup[dup.length - 1]
end

20.times do
    p make_random_picker([DUP.new("digiko", 10.0),
                          DUP.new("usada",  14.0),
                          DUP.new("puchiko", 5.0),
                          DUP.new("piyoko", 7.0),
                          DUP.new("rinna", 10.0),
                          DUP.new("mike", 10.0)]).name
end

実行結果は
$ ruby weight_random.rb | sort | uniq -c | sort -r

とかで計測します。とりあえず、1000回回すと

result.sh
    274 "usada"
    179 "digiko"
    171 "rinna"
    171 "mike"
    130 "piyoko"
     75 "puchiko"

となったので、まあ悪くない結果だと思います。

しかし、一番結果の上位に出てくるのがうさだとは、どういうことにょ!?

目からビィーーーーム!!

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10