質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

245閲覧

ruby, 繰り返しの繰り返し, メソット?クラス?,マーチンゲール法,シミュレーション

wpx-vv1uZ

総合スコア23

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/05/24 12:33

編集2019/05/24 15:45

前提・実現したいこと

マーチンゲール法のシミュレーションをrubyでやろうとしています

[1つ目の作業]
所持金・賭ける金額・目標金額を設定します。
所持金が賭ける金額に足りなくなるか、目標金額に達したら処理を終わります

処理が終わった時点で出た所持金を、
・目標金額に達した
・掛け金に足りなくなったが所持金は増えた
・負けた
に分けて、それぞれの回数をカウントします
[2つ目の作業]
上の作業を何回繰り返すか指定します。
最後に
・目標金額に達した
・掛け金に足りなくなったが所持金は増えた
・負けた
の確立をそれぞれ出します

[賭けのルール]
赤と黒のみのルーレットを想定
指定した色なら勝ち、違うなら負け
・勝った場合
掛け金+1000を所持金に足す
掛け金を一番最初の額に戻す
・負けた場合
掛け金を所持金から引く
掛け金を二倍にする

発生している問題・エラーメッセージ

処理の繋げ方が分かりません

該当のソースコード

ruby

1print "所持金を入力してください:" 2x = gets.chomp.to_i 3w = x 4print "最初の掛け金を入力してください:" 5y = gets.chomp.to_i 6u = y 7print "目標金額を入力してください:" 8z = gets.chomp.to_i 9print "試行回数を入力してください:" 10n = gets.chomp.to_i 11a = 0 #目標達成 12b = 0 #目標未達成かつ勝ち 13c = 0 #負け 14 15 until w < u || w >= z do 16 roulette = rand(2) 17 i_choice = rand(2) 18 if roulette == i_choice 19 w += u + 1000 20 u = y 21 else 22 w -= u 23 u *= 2 24 end 25 end 26# n.times do 27 if w >= z 28 a += 1 29 elsif w < z and w > x 30 b += 1 31 else 32 c += 1 33 end 34# end 35 36 print "目標達成した回数:", a, "\n" 37 print "確率:", a/n.to_f, "\n" 38 39 print "目標未達成かつ勝った回数:", b, "\n" 40 print "確率:", b/n.to_f, "\n" 41 42 print "負けた回数:", c, "\n" 43 print "確率:", c/n.to_f, "\n" 44

試したこと

defとして2つの作業を作るのかと思いましたが、知識が足りなくて上手くいきませんでした
どのように書けば良いでしょうか?

また、今回のようなケースで参考にしたら良い記事などあれば教えてください
よろしくお願いします

補足情報(FW/ツールのバージョンなど)

ruby

1=begin[賭けのルール] 2赤と黒のみのルーレットを想定 3指定した色なら勝ち、違うなら負け 4・勝った場合 5掛け金+1000を所持金に足す 6掛け金を一番最初の額に戻す 7・負けた場合 8掛け金を所持金から引く 9掛け金を二倍にする 10=end 11class Roulette 12 x = 0 13 y = 0 14 u = y 15 z = 0 16 roulette = rand(2) 17 i_choice = rand(2) 18 if roulette == i_choice 19 x += u + 1000 20 u = y 21 else 22 w -= u 23 u *= 2 24 end 25end 26 27 # 初期設定を入力 28x,y,z = gets.split.map(&:to_i) 29#x:所持金、y:掛け金、z:目標金額 30 31# 試行回数を入力 32n = gets.to_i 33#インスタンス変数として掛け金と所持金をもち賭けを実行するメソッド 34def roulette.bet 35 @u = x 36 @v = y 37 return do roulette 38end 39#所持金を返すメソッド 40def roulette.money 41 return x 42end 43#続行可能かを判定するメソッド 44def roulette.continue? 45 return x >= y and x < z 46end 47 48結果 = {"目標達成": 0,"増加": 0, "敗北": 0} 49n.times{ 50 roulette = Roulette.new(x, y) 51 roulette.bet while roulette.money < z && roulette.continue? 52 if roulette.money >= 目標金額 53 結果[:"目標達成"] += 1 54 elsif roulette.money >= 所持金 55 結果[:"増加"] += 1 56 else 57 結果[:"敗北"] += 1 58 end 59} 60# 結果を表示して終了 61a = 目標達成/n 62b = 増加/n 63c = 敗北/n

回答を参考に考えをまとめました。文法は間違いだらけです
どこから手をつければ良いでしょうか?

ruby

1print "所持金を入力してください:" 2x = gets.chomp.to_i 3v = x 4print "最初の掛け金を入力してください:" 5y = gets.chomp.to_i 6u = y 7print "目標金額を入力してください:" 8z = gets.chomp.to_i 9 10print "試行回数を入力してください:" 11n = gets.chomp.to_i 12 13i = 0 14a = 0 15b = 0 16c = 0 17 18n.times do 19until v < u || v >= z do 20 i += 1 21 roulette = rand(2) 22 i_choice = rand(2) 23 if roulette == i_choice 24 v += u + 1000 25 u = y 26 else 27 v -= u 28 u *= 2 29 end 30end 31 32if v >= z 33 a += 1 34elsif v < u and v >= x 35 b += 1 36else 37 c += 1 38end 39end 40 41puts [a,b,c] 42

最初に書いたコードがこれでした
このコードだと、[a,b,c]のどれか1つに試行結果がいってしまうので何か間違いがあるのはわかるのですが、具体的な所が分かりません。
何がいけないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

とりあえず、考え方だけ

まず

[賭けのルール]

赤と黒のみのルーレットを想定
指定した色なら勝ち、違うなら負け
・勝った場合
掛け金+1000を所持金に足す
掛け金を一番最初の額に戻す
・負けた場合
掛け金を所持金から引く
掛け金を二倍にする

は、ちょっと複雑な状態を持っているので
クラスとして実装するとよいでしょう。

インスタンス変数として掛け金と所持金をもち
賭けを実行するメソッド
続行可能かを判定するメソッド
所持金を返すメソッド
が必要かな

そうすると

ruby

1# 初期設定を入力 2所持金,賭け金,目標金額 = gets.split.map(&:to_i) 3 4# 試行回数を入力 5試行回数= gets.to_i 6 7結果 = {"目標達成": 0,"増加": 0, "敗北": 0} 8試行回数.times{ 9 roulette = Roulette.new(所持金, 賭け金) 10 roulette.bet while roulette.money < 目標金額 && roulette.continue? 11 if roulette.money >= 目標金額 12 結果[:"目標達成"] += 1 13 elsif roulette.money >= 所持金 14 結果[:"増加"] += 1 15 else 16 結果[:"敗北"] += 1 17 end 18} 19# 結果を表示して終了

ざっとこんな感じ
Rouletteクラスは自分で実装してみてください


ルーレットクラスを実装すると

ruby

1# [賭けのルール] 2# 赤と黒のみのルーレットを想定 3# 指定した色なら勝ち、違うなら負け 4# ・勝った場合 5# 掛け金+1000を所持金に足す 6# 掛け金を一番最初の額に戻す 7# ・負けた場合 8# 掛け金を所持金から引く 9# 掛け金を二倍にする 10class Roulette 11 # 初期化 12 def initialize(初期所持金, 初期掛け金) 13 @money = 初期所持金 14 @initial_bet = @bet = 初期掛け金 15 end 16 17 # 現在の所持金 18 # 省略すると、「attr_reader :money」だけになる 19 def money 20 @money 21 end 22 23 # 賭けが続けられるか判定する 24 def continue? 25 @money >= @bet 26 end 27 28 # 賭けを実行する 29 def bet 30 mychoice = [:red, :black].sample 31 roulette = [:red, :black].sample 32 33 if mychoice == roulette 34 @money += @bet+1000 35 @bet = @initial_bet 36 else 37 @money -= @bet 38 @bet *= 2 39 end 40 end 41end

まぁこんなん

投稿2019/05/24 13:09

編集2019/05/24 15:54
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wpx-vv1uZ

2019/05/24 14:08

回答ありがとうございます 頑張って考えてみます
wpx-vv1uZ

2019/05/24 14:49

不躾ですみません 自分が知識不足なだけなのですが、まだ勉強を始めたばかりでdefやclassの作り方をあまりわかっていません。 もう少し詳しい回答を頂けないでしょうか。 お時間があればよろしくお願いします
wpx-vv1uZ

2019/05/24 15:57

回答ありがとうございます class,def,インスタンス変数,グローバル変数,など知らない知識も多いのでこれから勉強していこうと思います お付き合い頂きありがとうございました
guest

0

ruby

1print "所持金を入力してください:" 2x = gets.chomp.to_i 3v = x 4print "最初の掛け金を入力してください:" 5y = gets.chomp.to_i 6u = y 7print "目標金額を入力してください:" 8z = gets.chomp.to_i 9 10print "試行回数を入力してください:" 11n = gets.chomp.to_i 12 13i = 0 14a = 0 15b = 0 16c = 0 17 18n.times do 19until v < u || v >= z do 20 i += 1 21 roulette = rand(2) 22 i_choice = rand(2) 23 if roulette == i_choice 24 v += u + 1000 25 u = y 26 else 27 v -= u 28 u *= 2 29 end 30end 31 32if v >= z 33 a += 1 34elsif v < u and v >= x 35 b += 1 36else 37 c += 1 38end 39 v = x 40 u = y 41end 42 43 44puts [a,b,c] 45

最後に使った変数v,u,の初期化を忘れていました
これで合っているでしょうか?

投稿2019/05/24 15:53

wpx-vv1uZ

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2019/05/24 16:58

あっているような気はします。 1週間後の自分が読んだ時に悩まない程度の変数名をつけるとよいでしょう。
wpx-vv1uZ

2019/05/24 23:43

コメントありがとうございます そのようにしようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問