自分ゲーセン大好きでよく通っているのですが、こんな設定を見かけました。
クレーンでボタンを押して6つのさいの目を振って、ゾロ目なら賞品獲得!
たこ焼きキャッチャーのような完全な運ゲー設定です。
これをC#でシュミレーションして、どのような結果になるのかを出力してみたいと思います。
設定と目的を定義する
僕の出会った設定は「ゾロ目なら景品獲得、またその中でも”1のゾロ目”なら高額景品獲得!」というものでした。
1プレイは100円。500円払うと6プレイ遊ぶことが出来ます。また、クレーンを落とせる位置は制限されていて、確実にさいの目を振ることが可能でした。
普通の景品はだいたい5000円くらいのもので、ピンゾロの景品が”[パチスロ北斗の拳 強敵]の筐体”だったので25000円位でしょう。(ネット通販で見てきました)
目的はもとを取ることなので設定は多分こんな感じでしょう。
問題文
ゲーセン好きなAtriaくんはサイコロの値を揃えるサイコロゲームを見つけた。
そのゲームでは1のゾロ目ならば25000円、それ以外のゾロ目ならば5000円分の商品がもらえる。また、1プレイは100円。500円払うと6プレイ遊ぶことが出来る。
N円消費したとき、Atriaくんが儲かっている場合は”Rich”、そうでない場合は”Poverty”と出力してください。
標準出力では N(100<N<10^6)が与えられる。
解いてみる
とりあえず、目的のコードがこちらになりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
using System; using System.Collections.Generic; using System.Linq; using static System.Console; using static System.Math; namespace Atcoder { class AtCodeeeeeeeeeeeeeeeeeeeer { static void Main(string[] args) { int N = int.Parse(ReadLine()); //何プレイできるか調べる int n = N; int CanPlay = 0; while (n>0) { if (n>=500) { n -= 500; CanPlay += 6; } else { n -= 100; CanPlay++; } } //乱数rを設定 System.Random r = new System.Random(); int HighPricecnt = 0; int LowPricecnt = 0; for (int i = 0; i < CanPlay; i++) { int i1 = r.Next(1, 6);int i2 = r.Next(1, 6);int i3 = r.Next(1, 6); int i4 = r.Next(1, 6);int i5 = r.Next(1, 6);int i6 = r.Next(1, 6); if (i1 == i2 && i2 == i3 && i3 == i4 && i4 == i5 && i5 == i6) { if (i1 == 1) { HighPricecnt++; } else { LowPricecnt++; } } } WriteLine( (HighPricecnt*25000+LowPricecnt*5000)>N ? "Rich" : "Poverty" ); WriteLine(HighPricecnt); WriteLine(LowPricecnt); } } } |
ロジック
儲かるかそうでないかを判断するための流れは
- 持っているお金から最大何回プレイできるかを調べる
- ゲームを(1)で求めた最大回数分シュミレーションする
- 得られた情報から解を出す
という感じになります。
1.持っているお金から最大何回プレイできるかを調べる
これは
自分の持っているお金が500円以上ある場合、500円を使用して6プレイ手に入れる。そうでない場合は100円使用して1プレイを得る。
ということになるので
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int N = int.Parse(ReadLine()); //何プレイできるか調べる int n = N; int CanPlay = 0; while (n>0) { if (n>=500) { n -= 500; CanPlay += 6; } else { n -= 100; CanPlay++; } } |
このような記述となります。
CanPlayが遊べる回数、nが持っているお金です。
2.ゲームを(1)で求めた最大回数分シュミレーションする
先ほど求めたCanPlayを用いてシュミレーションします。これは
1~6の乱数を6つ作り(これがサイコロ代わり)それらがどれも一致しているか(ゾロ目)をCanPlay回分判別する。
ということになります。
よって1のゾロ目が出た回数をHighPricecnt、それ以外のゾロ目の回数をLowPricecntとすると
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//乱数rを設定 System.Random r = new System.Random(); int HighPricecnt = 0; int LowPricecnt = 0; //CanPlay回forループを回します for (int i = 0; i < CanPlay; i++) { int i1 = r.Next(1, 6);int i2 = r.Next(1, 6);int i3 = r.Next(1, 6); int i4 = r.Next(1, 6);int i5 = r.Next(1, 6);int i6 = r.Next(1, 6); if (i1 == i2 && i2 == i3 && i3 == i4 && i4 == i5 && i5 == i6) { if (i1 == 1) { HighPricecnt++; } else { LowPricecnt++; } } } |
こうなります。
3.得られた情報から解を出す
最後に、ゲームからの収益は[25000 * 高額景品 + 5000 * 通常景品]で求められるので
1 2 3 4 5 |
WriteLine( (HighPricecnt*25000+LowPricecnt*5000)>N ? "Rich" : "Poverty" ); WriteLine(HighPricecnt); WriteLine(LowPricecnt); |
これで完成です。
実際に動かす
実際動かすとわかりますが、全然儲かりません。

500万かけても全く回収できません。
疑似乱数で作っているとはいえ、この設定は絶望的ということがわかりました。
まとめ
この手の設定がゲーセンに有ってもやらないことを心に決めました。