るびー めも

Ruby の学習メモを記す

宿題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万回のテストを実行中です。

そのうち終わるかな…