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)