るびー めも

Ruby の学習メモを記す

宿題

Ruby 学習問題

以下の仕様を満たす、Lottery クラスを作成しなさい。

# 重み付け抽選クラス(Lottery)の仕様。
#
# new(size)
# インスタンスを作成する。
# [PARAM] size: 最大の当選者数
#
# add(member, weight)
# 応募者を追加する。
# [PARAM] member: 応募者
# [PARAM] weight: 1以上の整数で指定する当選確率の重み。大きいほど当選しやすい。
#
# winners -> Array
# 当選者の配列を返す。当選者はweightを考慮しつつ、ランダムに選択される。

私が作成した、宿題の答えは以下。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# by Yuji Shimoda

class Lottery 
	@@max    = 0 
	@@tmp    = Array.new
	@@member = Array.new
	@@result = Array.new
	def initialize(size)
		@@max       = size
	end
	def add(member, weight)
		@@member << member
		weight.times do 
			@@tmp << member
		end
	end
	def result
		if @@max < @@member.length
			while @@max != @@result.length
					@@result << @@tmp[rand(@@tmp.length)]
					@@result.uniq!
			end
			return @@result
		else
			return @@member
		end
	end
end

lot = Lottery.new(1)
 
lot.add('John', 1) # 確率  1/100
lot.add('Tom',  9) #       9/100
lot.add('Bill',20) #      20/100
lot.add('Woz', 30) #      30/100
lot.add('Ken', 40) #      40/100

p lot.result

テストしてみましょう。

$ cat test.sh
#!/bin/sh

COUNT=100
COUNTER=0
while :
do
	if [ $COUNT -ne $COUNTER ];then
		./lottery.rb >> ./lot.$$.log
		COUNTER=$(($COUNTER+1))
	else
		break
	fi
done

while read LINE
do
	echo "=== $LINE ==="
	grep $LINE ./lot.$$.log | wc -l
	echo ""
done <<EOF
John
Tom
Bill
Woz
Ken
EOF

実行結果は、以下

$ ./test.sh
=== John ===
       1

=== Tom ===
      14

=== Bill ===
      19

=== Woz ===
      27

=== Ken ===
      39

$ cat lot*log
["Woz"]
["Ken"]
["Bill"]
["Woz"]
["Bill"]
["Ken"]
["Ken"]
["Bill"]
["Bill"]
["Woz"]
["Ken"]
["Ken"]
["Ken"]
["Bill"]
["Tom"]
["Ken"]
["Bill"]
["Bill"]
["Bill"]
["Bill"]
["Ken"]
["Woz"]
["Ken"]
["Bill"]
["Woz"]
["Tom"]
["Woz"]
["Ken"]
["Ken"]
["Tom"]
["Ken"]
["Woz"]
["Woz"]
["Tom"]
["Woz"]
["Bill"]
["Ken"]
["Ken"]
["Tom"]
["Woz"]
["Tom"]
["Tom"]
["Tom"]
["Woz"]
["Ken"]
["Woz"]
["Ken"]
["Woz"]
["Ken"]
["Tom"]
["Ken"]
["Ken"]
["Woz"]
["Ken"]
["Ken"]
["Bill"]
["Woz"]
["Woz"]
["Woz"]
["Bill"]
["Ken"]
["Ken"]
["Woz"]
["Ken"]
["Tom"]
["Ken"]
["Ken"]
["Woz"]
["Bill"]
["Ken"]
["Woz"]
["Bill"]
["Tom"]
["John"]
["Bill"]
["Ken"]
["Bill"]
["Ken"]
["Ken"]
["Woz"]
["Tom"]
["Ken"]
["Woz"]
["Tom"]
["Ken"]
["Ken"]
["Woz"]
["Bill"]
["Ken"]
["Woz"]
["Woz"]
["Ken"]
["Tom"]
["Woz"]
["Ken"]
["Ken"]
["Ken"]
["Woz"]
["Ken"]
["Bill"]
$ 

まぁ、それなりですね