[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『賭け金が変動していくゲームについての関数について教えてください』(初心者@優太郎)
1−2−3ウエイといわれている、確率がおよそ2分の1のゲームに使用される賭け方についての関数をご教授ください。
まず、1,2,3と書かれてある紙をご想像ください。
最初の賭け金は、この紙の両端に書かれてある2つの数字(MIN,MAX)の合計です。
よって、1+3=4をかけます。
負けた場合は、賭けた数字「4」を端に足します(言い換えると3に1プラスした数字)。紙には1,2,3,4となります。
次回は両端の数字の1+4=5を賭けます。
負け続けると以下同様に6、7、8と加えていきます。
最初、勝った場合は、両端の1と3の2つの数字を消して、次回は残った2を賭けます。
残った2を賭けて勝った場合は、2を消して、ワンセットの勝負が終了します。
勝った場合は常に両端の数字2つを消していきます(残った数字が一つの場合はその数字だけになります)。
一見簡単なように見えますが、勝ち負けが交錯して、負けが増えてくると複雑になってきます。
123でスタートして、
負け(1234)、
負け(12345)、
勝ち(234)、
負け(2345)、
負け(23456)、
勝ち(345)、
負け(3456)、
負け(34567)、
勝ち(456)、
負け(4567)、
負け(45678)、
負け(456789)、
勝ち(5678)…
という感じで、リセットできない場合はかなりの賭け金が必要になる方法です。100以上いく場合もあると思います。
このやり方のメリットは負けた場合は数字を一つ足していくのに対して、買った場合は二つの数字を消していくので、勝率50%のゲームではワンセットごとがリセットされやすく、勝ちの区切りがつきやすいということにあると思います(本当の確率計算では違うのだと思いますが、高等数学に詳しい方がいたら教えてください)
ワンセットで、1=1ドルとすると6ドルの利益が得られることになります。
本題に戻りますと、IF関数とVLOOKUP関数を使うのかな、とはわかったのですが、3日ほど考えても初心者の自分には全く数式が思いつきませんでした。
条件分岐が初心者には複雑すぎて、賭け金の増減のロジックはわかり易いのですが、
途中でリセットして最初の4に戻るところと、残った数字がひとつだけの場合、で躓いているところです。自分はマクロも使えないレベルですので、どなたか簡単に詳しく説明していただけませんでしょうか。
説明が拙く申し訳ありませんがよろしくお願いいたします。
実は海外のカジノでこの方法を試したことがあるのですが、まさか紙に書いてやるわけにもいかず暗算でかなりいい加減にやったのですが、ディーラーのお兄さんにはピラミッテイングと言われました。負けると賭け金が増えていくからでしょうね。ちなみに負けづらい方法ではあると思いましたが、負けが続くと賭け金がかなり増えて心理的にも計算も負担になるため、やはりトータルでは勝てておりません。必勝法ではないと思います。言ってみれば純粋な好奇心だけで質問しているのですが、重ねてお願いいたします。
A列は手入力、B1は手入力です。 C1を選択した状態で、挿入-->名前-->定義 と進み、 名前に「CalcRes」、参照範囲に「=IF(ISERROR(EVALUATE(B1)),"",EVALUATE(B1))」と入力して[ OK ]を押します。
B2=IF(AND(A2="勝ち",LEN(B1)-LEN(SUBSTITUTE(B1,"+",""))<2),0, IF(A2="勝ち",MID(B1,FIND("+",B1)+1,FIND(" ",SUBSTITUTE(B1,"+"," ",LEN(B1)-LEN(SUBSTITUTE(B1,"+",""))))-FIND("+",B1)-1), IF(A2="負け",B1&"+"&(LEN(B1)-LEN(SUBSTITUTE(B1,"+",""))+LEFT(B1,FIND("+",B1&"+")-1)+1),"")))
と入力して、必要分下にフィルドラッグしてください。
C1=CalcRes と入力して、こちらも必要分下にフィルドラッグしてください。
A列に「勝ち」または「負け」を入力していけば、C列に次に賭けるべき金額の係数が出ます。 [A] [B] [C] [1] 1+2+3 6 [2] 負け 1+2+3+4 10 [3] 勝ち 2+3 5 [4] 負け 2+3+4 9 [5] 勝ち 3 3 [6] 負け 3+4 7 [7] 負け 3+4+5 12 [8] 勝ち 4 4 [9] 負け 4+5 9 [10] 勝ち 0 0 (ROUGE)
(初心者@優太郎)です。 早速の回答ありがとうございます。
見慣れない関数やら記号がたくさん出てきて、簡単そうに思えたルールがこれほど 複雑とは…。教えていただいた方法を試してやってみるつもりです。
ひとつ気になったのが、 質問で私が申しましたルールでは「1+2+3」の場合 端と端の数字を足すというものです。 よって、この場合賭ける金額は6ではなく1+3=4になります。 同じように1+2+3+4では1と4で5になります(常に賭ける数字は端と端)。 勝ちの場合、端と端の2この数字を消す、負けの場合は端に一つ加えるというロジックは同じなので 結果的には同じようなストラテジーになるのかもしれませんが、自分の能力では検証できそうにもありません。
[A] [B] [C] [1] 1+2+3 6 → 4 [2] 負け 1+2+3+4 10 →5 [3] 勝ち 2+3 5 →同 [4] 負け 2+3+4 9 →6 [5] 勝ち 3 3 →同 [6] 負け 3+4 7 →同 [7] 負け 3+4+5 12 →8 [8] 勝ち 4 4 →同 [9] 負け 4+5 9 →同 [10] 勝ち 0 0
あと、賭け金が初期設定の123の場合の4(ご回答いただいたものでは6)に戻る場合 の関数でもいろいろやっても躓くところでした。
以上、とりとめもなく書きましたが、ありがとうございます。 もし、お手数でなければ、上の数式のどこを直せば、私の希望のものになるのかを お教え願いませんせんでしょうか。
直すにはロジックの組みなおしが必要ですが、123wayをGoogle検索したところ、私が提示した方法のようです。 参照HP http://www.dindof.com/dindo/du/casino/123way.html (ROUGE)
ゲームのことはよくわかりません、検証不足かもしれません。。。 時間が無いので、やりっぱなしで、逃げちゃいますがwww [A] [B] [C] [1] 1 2 3 4 [2] 負け 1 2 3 4 5 [3] 勝ち 2 3 5 [4] 負け 2 3 4 6 [5] 勝ち 3 3 [6] 負け 3 4 7 [7] 負け 3 4 5 8 [8] 勝ち 4 4 [9] 負け 4 5 9 [10] 勝ち A列は手入力。B1のみ手入力(数字と数字の間は、半角スペースを入力) B2 =TRIM(IF(A2="勝ち",SUBSTITUTE(SUBSTITUTE(B1,LOOKUP(9^9,--LEFT(B1,ROW($A$1:$A$10))),),LOOKUP(9^9,--RIGHT(B1,ROW($A$1:$A$10))),), B1&" "&LOOKUP(9^9,--RIGHT(B1,ROW($A$1:$A$10)))+1)) 以下コピー C1 =IF(COUNTIF(B1,"* *"),LOOKUP(9^9,--LEFT(B1,ROW($A$1:$A$10)))+LOOKUP(9^9,--RIGHT(B1,ROW($A$1:$A$10))),B1)&"" 以下コピー (キリキ)(〃⌒o⌒)b
とりあえず、早速のお礼まで。
自分でも検証してみます。
みなさん本当にありがとうございます。
このサイトのレスポンスの速さに驚くとともに感謝感謝です。
同じようなこと(ロジック)でもさまざまな式があるんで、びっくりです。
なかでも、しげちゃんさんのは知っている関数が多いのでなんとなく初心者の自分でも
とっつきやすそうです。自分はIF、AND、SUMあたりしか使えないビギナーなんです。
今回の件で、やっとネストとかLOOKUPやらがおぼろげという感じなもので。
とにかく皆さんの条件式(論理式?)をそのまま何かのデータに適用して試してみます。
重ねて感謝です。
結局どこの数字が欲しかったのですかね? 皆さんの書いて居られるC列の値だけでよければ 作業列を使ってこの様に求められるような気がします。 [A] [B] [C] [D] [1] 4 1 3 [2] 負け 5 1 4 [3] 勝ち 5 2 3 [4] 負け 6 2 4 [5] 勝ち 3 3 3 [6] 負け 7 3 4 [7] 負け 8 3 5 [8] 勝ち 4 4 4 [9] 負け 9 4 5 [10] 勝ち リセット 1 3 [11] 勝ち 2 2 2 [12] 勝ち リセット 1 3 C,D列が作業列です。 皆さんの書いて居られるB列の値は C列とD列とその間の数字になります。
B1,C1,D1は「4,1,3」を入力しておいてください。 A列は結果を入力して下さい。
B2に =IF(AND(C2=1,D2=3),"リセット",IF(C2=D2,C2,SUM(C2:D2))) C2に =IF(A2="","",IF(A2="勝ち",IF((SUM(C1)+1)>(SUM(D1)-1),1,SUM(C1)+1),C1)) D2に =IF(A2="","",IF(A2="勝ち",IF((SUM(C1)+1)>(SUM(D1)-1),3,SUM(D1)-1),SUM(D1)+1))
(HANA)
HANAさん本当にありがとうございます。
実は求めていたのはHANAさんの数式です。
それまでの方の数式を簡単な
シミュレーションでやってみると
エラーが出て、基本のきもできていない自分には
どこがエラーしているのか
判断ができなくて、困っていました。
おそらく、数式はどの方も合っていると思うのですが、
自分のコピペしたときのミスや
超初心者的な操作でミスっていたのだと。
私が求めていたのはB列の数字でこれが賭け金となります。
C、D列は123が変化していったときの
最小値、最大値です。
困っていたのは、勝ちで数を減らしていったとき、
二つの「2,3」とか「7,8」とか
隣り合った数字が残った場合で、勝った場合リセットになりますが
、その数式が全くお手上げでした。
加えて、残った数字が「2,2」「3,3」の同数のときで、
実際は残りは一つの数字なのですが
この1つを消して、リセットというのがこれまた難問なのでした。
このようなすっきりとした
初心者にも分かる公式を教えていただきありがとうございます。
HANAさんってもしかして天才ですか?
軽口はこれくらいにして、
自分ももう少しエクセルを勉強しなくてはと肝に銘じました。
いろいろ教えてくださった皆様にも
本当に本当にありがとうございます。
本当にすんません。また、初心者の悩みが
サンプルデータには勝ち、負けのほかに引分けもあったのでした。
引分けは前回の賭け金同様にするというのが
(1+4なら、4に1を加えてというのは
なしで、そのまま1+4で変わらずです)
ロジックなんじゃないかと気になってしまって。
引分けはブランクとか0にするのが普通だと思いましたので
D2列の最初の部分の2番目の””をいじるのだと考えました。
それで、そのままということで、D2もしくは(D2)、SUM(D2)とか
入れて見ましたが、だめでした。
再度HANAさん、もしくは親切なお方ご登場願えませんか
勝手なお願い重々承知ですが、はやくすっきりしたいので本当お願いします。
>D2に >=IF(A2="","",IF(A2="勝ち",IF((SUM(C1)+1)>(SUM(D1)-1),3,SUM(D1)-1),SUM(D1)+1)) 勝ち以外を全て負けと見なして SUM(D1)+1 と処理しています ここの部分を 負けと引き分けに分岐すればいいのでは
By しげちゃん
因みに 私の回答は必要ないようですので削除しました
はやくすっきりしたいなら、簡単な数式ですので仕組みを分かってください。 当てずっぼうでの変更は、あまりうまく行きませんよ。
>引分けはブランクとか0にするのが普通だと思いましたので >D2列の最初の部分の2番目の””をいじるのだと考えました。 もしこの考えが合っているなら、最初が同じ構造で始まる C2の式も変更する必要がありそうに思いませんか?
IF関数はお分かりですか IF(論理式,真の場合,偽の場合) と言う構造です。 D2の式はこのIF関数が3つ使ってあります。
まずは、A列の値が「勝ち」「負け」「未入力」の3パターンしか無い場合に A列の値によって、D列の値(最大の値)はどうなる必要があるのか考えてみましょう。 (1).A2に何も入力が無かったら、何も表示しません (2).A2が「勝ち」だったら、前の最大の値に-1します。 ※ただし、ワンセットが終了した場合は初期値「3」にします。 (3).A2が「勝ちでない」場合は、A2が「負け」と言う事なので 前の最大の値に+1します。
優太郎さんがD列に値を入れるときも、同じ考えで入れると思います。
問題は「どうなったらワンセットが終了」と考えるかだと思います。 ワンセットが終了する可能性があるのは、A列の値が「勝ち」だった時です。 A列の値が「勝ち」だったら、 最小の値は、前の最小の値に+1 最大の値は、前の最大の値に-1 しますよね。 例えば、(A)最小の値と最大の値が同じだった場合 (B)最小の値と最大の値の差が1だった場合 どちらでも、最小の値に+1して、最大の値に-1したら 最小の値と最大の値の大きさが逆転します。 最小3,最大3だった場合、最小4,最大2 最小3,最大4だった場合、最小4,最大3 つまり、A列の値が「勝ち」だったときは ※最小の値に+1 > 最大の値に-1 最初の値が最大の値より大きいかを確認し 大きい場合(真の場合)「3」 大きくない(偽の場合)「最大の値に-1」 それぞれ、試算結果によって変化させる必要があります。
これは、最小の値を求めるC列に関しても同じ事です。
上の考えをそのまま式にしたのが、D2の式です。 =IF(A2="","",IF(A2="勝ち",IF((SUM(C1)+1)>(SUM(D1)-1),3,SUM(D1)-1),SUM(D1)+1)) (1)^^^^^^IF((2)------,※=====================================,(3)~~~~~~)
A2が“勝ち”で無かった場合(3)の場所を実行するのですが 今回はこの場所を A2が引き分けだったら、前回と同じ それ以外(負け)だったら、前回に+1 に変更すればよいのですよね。
一気にD2の式をつくるのが難しいようで有れば (3)に入れる新しいIF関数をつくって載せてみてください。 ちなみに・・・・C2,D2の式に 前につくっていた式の残骸がありますね。 申し訳ないですが、↓の式に訂正させてください。(結果は変わりませんが。) C2:最小の値を求める =IF(A2="","",IF(A2="勝ち",IF((C1+1)>(D1-1),1,C1+1),C1)) D2:最大の値を求める =IF(A2="","",IF(A2="勝ち",IF((C1+1)>(D1-1),3,D1-1),D1+1))
少しすっきして、構造が分かりやすくなりましたかね?
(HANA)
しげちゃんさん、HANAさん、ご親切にどうもありがとう
ございます。
そうなんです、かなりあてずっぽうにやってるんで、我ながら困ってしまうんです。
しげちゃんさんのアドバイスでどうにか条件分岐はできました。
まず、IF関数のネストがあやふやで、括弧の数が分けわからなくなってきます。
HANAさんの最初の式でも、なんでSUMが出てくるのかな〜とわけ分かりませんでした。
解説じっくり読ませていただきます。
とともにしっかりしたエクセルの解説書が必要ですね。
SUMの件、ごめんなさい。 投稿する前につくっていた式(没だったのですが)が C,D列に「""」を返すような式になっていまして #VALUE!エラーが出るのを避けるためにSUM関数の中に入れていたのです。
方針を変えた段階で、消す必要があったのですが 気付かずそのまま投稿して仕舞った次第です。
ネストするときのカッコの数は、私も良く分からなくなります。 なので、一つずつ関数をつくって 置き換えて行くのが良いと思います。
例えば、私がD2の式をつくった手順は 最初に >(2).A2が「勝ち」だったら、前の最大の値に-1します。 >(3).A2が「勝ちでない」場合は、前の最大の値に+1します。 の部分の式 IF(A2="勝ち",D1-1,D1+1) をつくる。 ~~~~ 次に※の所の式 IF((C1+1)>(D1-1),3,D1-1) をつくる。
この※の式は、先につくったIF関数の「D1-1」となったときに使いたいので入れ替え IF(A2="勝ち",IF((C1+1)>(D1-1),3,D1-1),D1+1) ~~~~~~~~~~~~~~~~~~~~~~~~ この式をセルに入れてフィルドラッグすると、A列に入力がない時「D1+1」が計算されてしまうので 更に >(1).A2に何も入力が無かったら、何も表示しません の条件を入れる IF(A2="","",IF((C1+1)>(D1-1),3,D1-1),D1+1)) ~~~~~~~~~~~~ ~~
一気に直接書いていくと、想定とのずれに気づきにくいと思います。
(HANA)
HANAさん、何度も丁寧に説明してくれてありがとう
ございます。
条件設定の考え方、たいへん分かりやすかったです。
今回のロジックの変形版を作る際も参考にさせて
いただきます。
エクセルの入門書とか読んでも、分からなかった
条件分岐の考え方がすっきりしました。
パーツに分解して、細かく矛盾がないかその都度検証ですね。
拙い質問におつきあいくださって、感謝です。
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.