13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?