宿題
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"] $
まぁ、それなりですね