宿題2
前回の宿題にコメントを頂きました。
以下2点
・メソッド名はresultではなく、winnersにして
・クラス変数を使わないようにすれば、いい感じになりそう
クラスの使い方とかよく分かってなかったけど、今回の宿題で
少し分かってきました。後、オブジェクト指向に少し慣れてきた感が
頂いたコメントを元に、修正したソースは以下のとおり
#!/usr/bin/env ruby # -*- coding: utf-8 -*- # by Yuji Shimoda class Lottery Version = "0.5" def initialize(size=0) @max = size @result = Array.new @member = Array.new end def add(member, weight) (weight-1).times { @member << member } end def winners if @max < @member.uniq.length while @max != @result.length @result << @member[rand(@member.length)] @member.delete(@result[@result.length-1]) end return @result else return @member.uniq end end end lot = Lottery.new(1) lot.add('John',10) lot.add('Tom', 10) lot.add('Bill',10) lot.add('Woz', 10) lot.add('Ken', 10) p lot.winners
#少しはまともになったかな?
もう少しソースコードをリファクタリング出来るか
検討してみたけど、現状の実装だと2次元配列で少し圧縮できる位で
可読性下がりそうだったから、辞めた。
相変わらずシェルスクリプトでテスト中。
すべてのメンバーの重みを合わせているので
テスト回数が多ければ多いほど、重みで指定した当選回数に
収束していくはず。今は、100万回のテストを実行中です。
そのうち終わるかな…