Rubyのwhileを使ってみる

作るプログラムは

1〜6までの数を入力して、コンピュターが出す数を当てよう
というプログラム。
ここではwhileを使ってプレーヤーは3回戦までゲームをすることができます。


このプログラムでつまづいたのは、line3のwhileの条件です。
3回戦なので、始めは"trial_count <= 3"としていましたが、trial_countは0から始まるので"trial_count < 3"となります。うっかり。

Whileの条件式は範囲がずれると無限ループになるので注意!!



さて、モンティ・ホールの問題です。
これルールを理解するの難しいかった・・・




モンティ・ホールが司会をするゲームショーです。
ゲームのやり方は・・・


・会場には3つのドアがある。
・うち1つのドアの向こうには景品があり、他はヤギが入っている
・司会者はどのドアに景品があるか知っている
・プレーヤーが3つのうち1つのドアに立つ
・司会者はプレーヤーが選ばなかったヤギのいるドアを開ける
・残りの2つのドアどちらを開けるかプレーヤーは選ぶことができる


最後にプレーヤーはドアを移動すべきか、そうでないか、それぞれ景品が当たる確率を求めます。

とりあえず本を読むまま写経してみました。でも一部わからないところがあります。それは、どのドアを開けるかを決める関数。

  3 #
  4 # === 概要
  5 #
  6 # ゲームを実行する 
  7 #
  8 # === 引数
  9 # +change+::
 10 # 決めた位置を変えないのならばfalse、変えるのならばtrue
 11 #
 12 # === 戻り値
 13 #
 14 # 勝てば1、負ければ0
 15 #
 16 # === 詳細
 17 # * 乱数で当たりのドアを決める
 18 #   当たりのドアには1、はずれのドアには0を設定する。
 19 # プレイヤーは最初、ドア0を選択するものとする
 20 # changeが真のとき
 21 # ドア1が外れならモンティはドア1を開けるとしてドア2を選択
 22 # ドア1が当たりならモンティはドア2を開けるのでドア1を選択
 23 # 選択したドアに相当する数(当たりなら1、外れなら0)を返す
 24 def do_game(change)
 25   door0 = door1 = door2 = 0
 26   hit = rand(3)
 27   if hit == 0
 28     door0 = 1
 29   elsif hit == 1
 30     door1 = 1
 31   else
 32     door2 = 1
 33   end
 34   if change
 35     if door1 == 0
 36       return door2
 37     else
 38       return door1
 39      end
 40     end
 41     door0
 42 end

これ想像ができない・・・。
どのドアが当たりか決めて
ドアを変更するようなら、変更したドアを返す。
どうしてプレーヤーが始めに開くドアは必ず0なんだろう・・・


ここで覚えたことはfor関数の書き方です。



ポイント
for関数・while関数を覚えた。

for 変数名 in (開始値..終了値)
…(式)…
end

while 条件式
…(式)…
wend

いくつ回すかの判断を回転数か、条件式で指定するか どちらかで使い分ける。
終了値は未満"<"で考えると間違えない。
10回繰り返したい時for in (0..10)