ブログ内検索

2021年9月16日木曜日

ビンゴファームのPO率計算プログラム

 先に結果のみ貼り付ける。あとでソースコード…?

緑カード------------------------------------------------------------------------------

FREE5個 PO率60.1% 平均0.623ライン スーパー0.24% ハイパー0.03%

FREE6個 PO率65.5% 平均0.678ライン スーパー0.30% ハイパー0.03%

FREE7個 PO率71.2% 平均0.735ライン スーパー0.40% ハイパー0.03%

FREE8個 PO率77.2% 平均0.791ライン スーパー0.48% ハイパー0.04%

FREE9個 PO率83.5% 平均0.853ライン スーパー0.53% ハイパー0.05%

FREE10個 PO率90.8% 平均0.929ライン スーパー0.58% ハイパー0.07%

FREE11個 PO率97.6% 平均0.998ライン スーパー0.66% ハイパー0.07%

FREE12個 PO率104.5% 平均1.065ライン スーパー0.76% ハイパー0.08%

FREE13個 PO率111.2% 平均1.135ライン スーパー0.82% ハイパー0.08% 

FREE14個 PO率118.9% 平均1.195ライン スーパー0.89% ハイパー0.12%

FREE15個 PO率125.4% 平均1.253ライン スーパー0.96% ハイパー0.15%

青カード-------------------------------------------------------------------------------

FREE8個 PO率84.7% 平均0.879ライン スーパー0.57% ハイパー0.03%

FREE9個 PO率88.8% 平均0.910ライン スーパー0.67% ハイパー0.04%

FREE10個 PO率100.1% 平均1.018ライン スーパー0.80% ハイパー0.06%

FREE11個 PO率114.3% 平均1.151ライン スーパー0.97% ハイパー0.09%

FREE12個 PO率122.5% 平均1.222ライン スーパー1.04% ハイパー0.12%

FREE13個 PO率135.8% 平均1.344ライン スーパー1.24% ハイパー0.15%

FREE14個 PO率142.3% 平均1.402ライン スーパー1.36% ハイパー0.15%

FREE15個 PO率153.8% 平均1.509ライン スーパー1.66% ハイパー0.12%

FREE16個 PO率167.7% 平均1.626ライン スーパー2.07% ハイパー0.09%

FREE17個 PO率179.1% 平均1.722ライン スーパー2.35% ハイパー0.08%

FREE18個 PO率191.2% 平均1.812ライン スーパー2.63% ハイパー0.09%

FREE19個 PO率207.2% 平均1.923ライン スーパー3.06% ハイパー0.11%

FREE20個 PO率215.0% 平均1.976ライン スーパー3.28% ハイパー0.12%

FREE21個 PO率245.4% 平均2.176ライン スーパー4.01% ハイパー0.19%

赤カード---------------------------------------------------------------------------------

FREE24個 PO率496.0% 平均3.480ライン スーパー11.69% ハイパー0.42%

FREE28個 PO率897.9% 平均5.034ライン スーパー22.68% ハイパー0.68%

FREE32個 PO率1098.0%平均5.662ライン スーパー32.27% ハイパー0.57%

プログラムの方法としては、例えば空きマスが56個ならば{1,2,3,4…25,1,2,3,4…,25,1,2,3,4,5,6}という配列を作ってそれをランダムに並び替え配置。

あとは入賞の組{1,2,3,4,5,6,7,8…,25}をランダムに並べて最初の8つの要素を入賞番号とする。ここで注意したいのは、この番号を{1,2,3,4,5,6,7,8}で固定しても一見マスの番号配置がランダムなのでこちらもランダムにする必要がないのではないかと思うところだが、それはこのゲーム以外の数字が均等にならぶゲームではそうなのだが、1~6の番号はマスの番号配置の仕方から必ず3個のマスにHITする。8個の番号中、6個が3個マスHITするのは、もともと3個HIT確率が初期で32%、2個HIT確率が初期で68%であることを考えるとあまりに不自然である。これを間違えてしまうと、以前の我のようにやたら高いPO率が出てくる。

緑カードでFREEが12個以上あれば、おおむねメダルは増える傾向にある。

青カードでは場合によってはメダルが減る傾向のカードになることも。

赤カードのFREE32個では平均で10倍以上の返しが期待でき、スーパーラインの成立確率は実に30%越え。ただしハイパーは0.5%程度と低い。

以下は計算プログラム。チェーンボンバーなどに比べるとかなり簡単。

やはりmathematica用。

green = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},

   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},

   {0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

   {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},

   {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},

   {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0},

   {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},

   {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},

   {1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},

   {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

   {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0},

   {0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},

   {0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},

   {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

   {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0},

   {0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0}};

blue = {{1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},

   {0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 

    1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0},

   {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0},

   {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},

   {0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},

   {0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},

   {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0},

   {0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},

   {1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},

   {0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0},

   {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0}};

red = {{1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},

   {0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0},

   {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0},

   {0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0},

   {0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0}};

bingo[list_] := 

  For[a = 1, a <= 1, a++, 

   If[list[[1]] == 1 && list[[2]] == 1 && list[[3]] == 1 && 

     list[[4]] == 1, line += 1]; 

   If[list[[5]] == 1 && list[[6]] == 1 && list[[7]] == 1 && 

     list[[8]] == 1, line += 1]; 

   If[list[[9]] == 1 && list[[10]] == 1 && list[[11]] == 1 && 

     list[[12]] == 1, line += 1]; 

   If[list[[13]] == 1 && list[[14]] == 1 && list[[15]] == 1 && 

     list[[16]] == 1, line += 1]; 

   If[list[[1]] == 1 && list[[5]] == 1 && list[[9]] == 1 && 

     list[[13]] == 1, line += 1]; 

   If[list[[2]] == 1 && list[[6]] == 1 && list[[10]] == 1 && 

     list[[14]] == 1, line += 1]; 

   If[list[[3]] == 1 && list[[7]] == 1 && list[[11]] == 1 && 

     list[[15]] == 1, line += 1];

   If[list[[4]] == 1 && list[[8]] == 1 && list[[12]] == 1 && 

     list[[16]] == 1, line += 1]; 

   If[list[[1]] == 1 && list[[6]] == 1 && list[[11]] == 1 && 

     list[[16]] == 1, line += 1]; 

   If[list[[4]] == 1 && list[[7]] == 1 && list[[10]] == 1 && 

     list[[13]] == 1, line += 1]];

superbingoculc[list1_, list2_, list3_, list4_] := 

  For[b = 1, b <= 1, b++, 

   If[list1[[1]] == 1 && list1[[5]] == 1 && list1[[9]] == 1 && 

     list1[[13]] == 1 && list3[[1]] == 1 && list3[[5]] == 1 && 

     list3[[9]] == 1 && list3[[13]] == 1, superbingo += 1]; 

   If[list1[[2]] == 1 && list1[[6]] == 1 && list1[[10]] == 1 && 

     list1[[14]] == 1 && list3[[2]] == 1 && list3[[6]] == 1 && 

     list3[[10]] == 1 && list3[[14]] == 1, superbingo += 1]; 

   If[list1[[3]] == 1 && list1[[7]] == 1 && list1[[11]] == 1 && 

     list1[[15]] == 1 && list3[[3]] == 1 && list3[[7]] == 1 && 

     list3[[11]] == 1 && list3[[15]] == 1, superbingo += 1]; 

   If[list1[[4]] == 1 && list1[[8]] == 1 && list1[[12]] == 1 && 

     list1[[16]] == 1 && list3[[4]] == 1 && list3[[8]] == 1 && 

     list3[[12]] == 1 && list3[[16]] == 1, superbingo += 1]; 

   If[list2[[1]] == 1 && list2[[5]] == 1 && list2[[9]] == 1 && 

     list2[[13]] == 1 && list4[[1]] == 1 && list4[[5]] == 1 && 

     list4[[9]] == 1 && list4[[13]] == 1, superbingo += 1]; 

   If[list2[[2]] == 1 && list2[[6]] == 1 && list2[[10]] == 1 && 

     list2[[14]] == 1 && list4[[2]] == 1 && list4[[6]] == 1 && 

     list4[[10]] == 1 && list4[[14]] == 1, superbingo += 1]; 

   If[list2[[3]] == 1 && list2[[7]] == 1 && list2[[11]] == 1 && 

     list2[[15]] == 1 && list4[[3]] == 1 && list4[[7]] == 1 && 

     list4[[11]] == 1 && list4[[15]] == 1, superbingo += 1]; 

   If[list2[[4]] == 1 && list2[[8]] == 1 && list2[[12]] == 1 && 

     list2[[16]] == 1 && list4[[4]] == 1 && list4[[8]] == 1 && 

     list4[[12]] == 1 && list4[[16]] == 1, superbingo += 1]; 

   If[list1[[1]] == 1 && list1[[2]] == 1 && list1[[3]] == 1 && 

     list1[[4]] == 1 && list2[[1]] == 1 && list2[[2]] == 1 && 

     list2[[3]] == 1 && list2[[4]] == 1, superbingo += 1]; 

   If[list1[[5]] == 1 && list1[[6]] == 1 && list1[[7]] == 1 && 

     list1[[8]] == 1 && list2[[5]] == 1 && list2[[6]] == 1 && 

     list2[[7]] == 1 && list2[[8]] == 1, superbingo += 1]; 

   If[list1[[9]] == 1 && list1[[10]] == 1 && list1[[11]] == 1 && 

     list1[[12]] == 1 && list2[[9]] == 1 && list2[[10]] == 1 && 

     list2[[11]] == 1 && list2[[12]] == 1, superbingo += 1]; 

   If[list1[[13]] == 1 && list1[[14]] == 1 && list1[[15]] == 1 && 

     list1[[16]] == 1 && list2[[13]] == 1 && list2[[14]] == 1 && 

     list2[[15]] == 1 && list2[[16]] == 1, superbingo += 1]; 

   If[list3[[1]] == 1 && list3[[2]] == 1 && list3[[3]] == 1 && 

     list3[[4]] == 1 && list4[[1]] == 1 && list4[[2]] == 1 && 

     list4[[3]] == 1 && list4[[4]] == 1, superbingo += 1]; 

   If[list3[[5]] == 1 && list3[[6]] == 1 && list3[[7]] == 1 && 

     list3[[8]] == 1 && list4[[5]] == 1 && list4[[6]] == 1 && 

     list4[[7]] == 1 && list4[[8]] == 1, superbingo += 1]; 

   If[list3[[9]] == 1 && list3[[10]] == 1 && list3[[11]] == 1 && 

     list3[[12]] == 1 && list4[[9]] == 1 && list4[[10]] == 1 && 

     list4[[11]] == 1 && list4[[12]] == 1, superbingo += 1]; 

   If[list3[[13]] == 1 && list3[[14]] == 1 && list3[[15]] == 1 && 

     list3[[16]] == 1 && list4[[13]] == 1 && list4[[14]] == 1 && 

     list4[[15]] == 1 && list4[[16]] == 1, superbingo += 1]];

hyperbingoculc[list1_, list2_, list3_, list4_] := 

 For[c = 1, c <= 1, c++, 

  If[list1[[1]] == 1 && list1[[6]] == 1 && list1[[11]] == 1 && 

    list1[[16]] == 1 && list4[[1]] == 1 && list4[[6]] == 1 && 

    list4[[11]] == 1 && list4[[16]] == 1, hyperbingo += 1]; 

  If[list2[[4]] == 1 && list2[[7]] == 1 && list2[[10]] == 1 && 

    list2[[13]] == 1 && list3[[4]] == 1 && list3[[7]] == 1 && 

    list3[[10]] == 1 && list3[[13]] == 1, hyperbingo += 1]]

さきにマスがHIT(1)orFREE(1)の状態かそうでない状態(0)を格納したリストがあると仮定して、そのリストのn番目(n=1,2,3,…16)を適宜判定してビンゴ個数をカウントする。
ついで本体。実行部分。
do = 1000000;
For[free = 32, free <= 32, free++, totalodds = 0; totalstar = 0; 
 totalline = 0; totalsuper = 0; totalhyper = 0;
 over50 = over30 = over10 = over5 = over3 = over1 = totalstar = 0; 
 For[times = 1, times <= do, times++, in = RandomSample[Range[25]]; 
  pattern = {0, 0, 0, 0}; 
  While[Count[red[[pattern[[1]]]], 1] + 
     Count[red[[pattern[[2]]]], 1] + Count[red[[pattern[[3]]]], 1] + 
     Count[red[[pattern[[4]]]], 1] != free, 
   pattern = RandomSample[{1, 2, 3, 4, 5}]]; 
  card1 = red[[pattern[[1]]]]; card2 = red[[pattern[[2]]]]; 
  card3 = red[[pattern[[3]]]]; card4 = red[[pattern[[4]]]];
  length = 
   Count[card1, 0] + Count[card2, 0] + Count[card3, 0] + 
    Count[card4, 0];
  Which[length <= 25, numlist = Table[i, {i, 1, length}], 
   26 <= length <= 50, 
   numlist = Join[Table[i, {i, 25}], Table[i, {i, length - 25}]], 
   51 <= length <= 75, 
   numlist = 
    Join[Table[i, {i, 25}], Table[i, {i, 25}], 
     Table[i, {i, 1, length - 50}]]];
  numlist = RandomSample[numlist];
  card = Join[card1, card2, card3, card4]; card0 = card; 
  hole = Position[card0, 0];
  For[i = 1, i <= length, i++, 
   If[numlist[[i]] == in[[1]] || numlist[[i]] == in[[2]] || 
     numlist[[i]] == in[[3]] || numlist[[i]] == in[[4]] || 
     numlist[[i]] == in[[5]] || numlist[[i]] == in[[6]] || 
     numlist[[i]] == in[[7]] || numlist[[i]] == in[[8]], 
    card[[hole[[i, 1]]]] = 1]]; line = 0; superbingo = 0; 
  hyperbingo = 0;
  bingo[card[[1 ;; 16]]]; bingo[card[[17 ;; 32]]]; 
  bingo[card[[33 ;; 48]]]; bingo[card[[49 ;; 64]]];
  superbingoculc[card[[1 ;; 16]], card[[17 ;; 32]], card[[33 ;; 48]], 
   card[[49 ;; 64]]];
  hyperbingoculc[card[[1 ;; 16]], card[[17 ;; 32]], card[[33 ;; 48]], 
   card[[49 ;; 64]]];
  odds = 0; star = 0;
  Which[line == 0, odds = 0, line == 1, odds = 1, line == 2, 
   odds = 1.5, line == 3, odds = 2.5, line == 4, odds = 4, line >= 5, 
   odds = 2*line - 4];
  odds += superbingo*10;
  odds += hyperbingo*50;
  If[odds >= 1, over1 += 1]; If[odds >= 3, over3 += 1]; 
  If[odds >= 5, over5 += 1; star = 1]; 
  If[odds >= 10, over10 += 1; star = 2]; 
  If[odds >= 30, over30 += 1; star = 3]; 
  If[odds >= 50, over50 += 1; star = 5];
  star += superbingo*5;
  star += hyperbingo*10;
  totalodds += odds; totalline += line; totalsuper += superbingo; 
  totalhyper += hyperbingo; totalstar += star;
  If[QuotientRemainder[times, 10000][[2]] == 0, 
   Print[N[{free, times, totalodds/times, totalline/times, 
      totalsuper/times, totalhyper/times, over1, over3, over5, over10,
       over30, over50, totalstar/times}]]]]; 
 result[[free - 19, 1]] = free;
 result[[free - 19, 2]] = 
  N[{totalodds/times, totalline/times, totalsuper/times, 
    totalhyper/times, over1, over3, over5, over10, over30, over50, 
    totalstar/times}]]
ただビンゴをしているかどうかを判定するだけのプログラムなので、構造自体は極めて簡単である。
ただし不確定要素が大きいため、25C8通りの全数え上げはやめている。
このプログラムにより以下の結果を得た。FREEの個数、カードの色別に解析。