2018-12-25背景かつて、モナコのあるカジノを破産させたと伝えられる「カジノの必勝法」がある。その名も「モンテカルロ法」。※Qiita民の間では、シミュレーションや数値計算を乱数を用いて行う手法としての「モンテカルロ法」は高名であるが、それとは同姓同名の別人(別法?)。「マーチンゲール法」だろう。倍々に賭けていって、いつかは当たるので必ず勝てる、という戦略。倍々にすると、どこかで資金的orルール的な掛け金の上限に達するため、これは必勝法とは言えない、とすぐに分かる。「モンテカルロ法」は、はるかに優秀な戦略で、実用的だ。内容を聞けば、カジノを破産させたという伝説にも、説得力がある(かもしれない)。「東京カジノ」でも「ラスベガス」でも「マカオ」でも、または、株や仮想通貨の取引においても使える(かもしれない)。いうシミュレーション結果が出た。使って、勝ち負けのシミュレーション結果をグラフ表示するアプリ(Webサイト)を作った物語である。実際に読者にも動かせる形で、そのシミュレータも公開する。挑むクソアプリ(実用性は無い)を作った物語。多くの男たちが、カジノの必勝法を編み出し、そして破産していった。「伝説的カジノの必勝法」を心ゆくまで試してほしい。chart.jsの他のサンプルも提示するので、JavaScriptでHTML上に綺麗なグラフを書く、ことの実戦的サンプルとしても見ていただけるかもしれない。最後に、コードの主要部分も掲載しておく。大真面目な語りで盛大にボケる話だと予め宣言しておく。※カジノに行く場合は必ず自己責任で賭けてくださいね。戦略と、必勝である理由を説明する。勝てば倍になるゲームを例として説明する。3]なぜ「必勝」なのか?「数字のリストの合計」=「目標金額」と常に等しい、と気がつく。全ての数字が消えれば目標達成になる。平均すれば、必ず数字の個数を減らしていくことができる。目標を達成することができる。負け続けた場合でも、掛け金の上昇がかなり緩やかであることだ。結果10$の儲け!!もし、マーチンゲール法だと、10$儲けようとすると、3連敗後に1勝の場合、最後の掛け金は80$賭けることになる。掛け金の増加がはるかに緩やかであることが確認できる。非の打ちどころがない方法に見える。負け続けても掛け金が倍々的に増えることは無い。「モンテカルロ法のシミュレータ」を開発し、その性能を試してみることにした。「必勝法を試す」から。※他にも**「ガチャ」の2%の当たりは100回引いて出るのか?**などが試せるシミュレータが用意されている。前提として、「控除率」は0%とした。「破産」まで行く前に「カジノの最大賭け金の設定」に引っ掛かるものとして、最大賭け金を設定できるものとした。シミュレーション結果1chart.jsを使て、所持金と賭け金のグラフを作成できる。最終的には10$の儲けを得て、21回で勝利している。上の例も、最終的には勝利した図。通常は、もっと簡単に10$獲得して終わり、というシンプルな図になることが多い。賭け金の上限値として、100$まで、という低めの天井を設定しているため、それを超えてしまう場合敗北扱い。上の例では、その時点で清算したとして、310$失ったことになる。個々のゲーム(10$儲けるか、大金を失うか)ではなく、これを繰り返した場合だろう。グラフの下の方に、「累計」をテキスト表示している。PCからアクセスしている場合は、一度実行後、エンターキーを押下し続けることで、連続して試行できる。ここから先の結果は、ぜひご自身のPCのエンターキーの上に何か文鎮でも置いて試してみて欲しい。「必勝法を試す」から。人によって累計の結果が結構変わってしまう。総計で、損をする場合もあれば、得をする場合もある。勝率は、およそ97%ほどになると思われる。平均すれば、必ず数字の個数を減らしていくことができる。誰かに教えると大変自慢できるかもしれない。(※くどいですが、自己責任でご利用ください)実際に、本稿で作成したシミュレータでは、(100$という低めの上限を設定した場合でも)97%の確率で10$得ることができた。**数学的に、本当はいくらの期待値なのか?**は、ここには解を記さない。クソアプリカレンダーに投稿したから実用度は無い!(コメント欄で数学的解説をしてくださる方がいたら、それはそれで大歓迎。)興味がわいた方は考えてみると面白いかもしれない。実戦でも、使い方によっては楽しいと思う。目的が欲しくて作ったため、他のグラフサンプルも掲載している。2%で当たるガチャを、100回引いた時に、一個も出てこない確率は?ということを計算&グラフ表示できる機能もオススメ。分析グラフ編(Qiitaの可視化から見えた、人気技術ランキングの推移)で活用している。最後に、主要部分のコードを掲載する。訓練不要で誰でも速読!日本一の速読アプリ「瞬間速読」の個人開発物語(25万DL)↑の記事で言及している方法と全く同様の方法だ。スマホアプリにしなくても、そのままWebサイト上でも公開できる。doCalcAndGraph_MON(){maxkaisuu=parseInt(document.forms.inputform.sikoukaisuu_MON.value,10);maxbet=parseInt(document.forms.inputform.maxbet_MON.value,10);//TODO://本当は入力チェックする//データ配列を用意する。["+mon_array+"]<br>\n";//一回目は手動で0点を入れる。label_array.push(0);data_array.push(motiten);console.log(mon_array);//賭けた回数は別途カウントしておく。aa++){//現在の長さを確認する。@1で分割<br>\n";console.log("特殊分割");//特殊処理:一個だけ数字が残っている場合は、「5」⇒「2」「3」など分割。//現在1数字しかない。その数字から1を引く。["+mon_array+"]<br>\n";console.log(mon_array);}//特殊分割を行うと配列の長さも変わっているので注意。//今回賭ける値を設定する。){jyoukyoutext+="◎勝利!<br>\n";//勝った場合は、先頭と末尾を削除する。motiten+=betValue;//先頭要素の削除mon_array.shift();//末尾の要素の削除mon_array.pop();}else{jyoukyoutext+="×敗北<br>\n";//負けた場合は賭けた額に等しい値を末尾に追加する。["+mon_array+"]<br>\n";//いくらかけたかのデータを格納する(一個前の配列になる)kakekin_array.push(betValue);kakekaisuu+=1;//記録更新:if(mon_saidaikakekin<betValue){mon_saidaikakekin=betValue;}if(mon_saidaihusai>motiten){mon_saidaihusai=motiten;}//データを配列に格納する。data_array.push(motiten);label_array.push(aa+1);console.log(mon_array);}//合計値の変更mon_sum_motiten+=motiten;mon_sum_kaisuu+=kakekaisuu;mon_sum_monkaisuu+=1;//描画用のデータにして、実際に描画する。document.getElementById("canvas_MON").getContext("2d");//chart.jsは同じキャンバス中にグラフを重ねていくため//前のグラフがある場合は廃棄を行う。個人的には、役立たなくても「クソアプリ」という表現は好きではない。その観点はとても重要だと思う。クソアプリ、とは、いわば「遊び」。実用性が無く役立たなくても、見た人に強烈な印象を残し、なんらかのインスピレーションを与える場合も多いだろう。人類の進化は「遊び」からはじまる。生活にも役に立つような「発明」が生まれるのだ。~この物語はフィクションです。実在のものとは関係ありません。(チャー・フイター)は架空の人物です。