###### tags: `math`
# 賓果遊戲3x3試算
## 數據展示
total|pick|0|1|2|3|4|5|6|7|8
---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:
20|5|931187|67302|1511|0|0|0|0|0|0
20|6|868147|124010|7440|403|0|0|0|0|0
20|7|781775|193129|22356|2569|144|27|0|0|0
20|8|677855|263041|49298|8479|1070|221|36|0|0
20|9|560629|322959|89549|21662|4047|889|260|0|5
20|10|439795|359678|140857|44527|11001|2904|1185|0|53
20|11|323270|365320|195387|79248|24514|7902|3994|0|365
20|12|219171|339432|241007|123924|46707|17826|10640|0|1293
20|13|134930|281371|267466|175100|77581|35576|23772|0|4204
20|14|72057|207163|261252|221177|114277|64644|47596|0|11834
20|15|32372|128163|220155|248787|149139|105674|85938|0|29772
20|16|10435|60981|154599|241117|170006|158683|136123|0|68056
20|17|1835|17651|78565|187771|163860|211855|193137|0|145326
20|18|0|0|21272|94591|121087|242430|230687|0|289933
20|19|0|0|0|0|50293|199437|200228|0|550042
## 結果整理
https://docs.google.com/spreadsheets/d/1GCMojdSZY6IZ0aq-tsuZlTfPPw8wVYN4xCPuAJG_m4I/edit?usp=sharing
## 程式碼實現
```go
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
measure_time := 100 * 10000
for n := 9; n <= 20; n++ {
for m := 5; m < n; m++ {
statmap := map[int]int{}
for i := 0; i < measure_time; i++ {
statmap[round3x3(n, m)]++
}
fmt.Printf("%v,%v,%v\n", n, m, statmap)
}
}
}
func round5x5(n, m int) int {
bingoTable := newTable(n, 25)
checkTable := make([]bool, 25)
remaining := genNArr(n)
rand.Shuffle(len(remaining), func(i, j int) { remaining[i], remaining[j] = remaining[j], remaining[i] })
for i := 0; i < m; i++ {
lucky := remaining[i]
for b := 0; b < len(bingoTable); b++ {
if bingoTable[b] == lucky {
checkTable[b] = true
break
}
}
}
line := 0
for i := 0; i < len(lineTable5x5); i++ {
if checkTable[lineTable5x5[i][0]] &&
checkTable[lineTable5x5[i][1]] &&
checkTable[lineTable5x5[i][2]] &&
checkTable[lineTable5x5[i][3]] &&
checkTable[lineTable5x5[i][4]] {
line++
}
}
return line
}
func round3x3(n, m int) int {
bingoTable := newTable(n, 9)
checkTable := make([]bool, 9)
remaining := genNArr(n)
rand.Shuffle(len(remaining), func(i, j int) { remaining[i], remaining[j] = remaining[j], remaining[i] })
for i := 0; i < m; i++ {
lucky := remaining[i]
for b := 0; b < len(bingoTable); b++ {
if bingoTable[b] == lucky {
checkTable[b] = true
}
}
}
line := 0
for i := 0; i < len(lineTable3x3); i++ {
if checkTable[lineTable3x3[i][0]] &&
checkTable[lineTable3x3[i][1]] &&
checkTable[lineTable3x3[i][2]] {
line++
}
}
return line
}
func newTable(n, m int) []int {
all := genNArr(n)
rand.Shuffle(len(all), func(i, j int) { all[i], all[j] = all[j], all[i] })
return all[:m]
}
func genNArr(n int) []int {
all := []int{}
for i := 1; i <= n; i++ {
all = append(all, i)
}
return all
}
var lineTable3x3 = [][]int{
{0, 1, 2},
{3, 4, 5},
{6, 7, 8},
{0, 3, 6},
{1, 4, 7},
{2, 5, 8},
{0, 4, 8},
{2, 4, 6},
}
var lineTable5x5 = [][]int{
{0, 1, 2, 3, 4},
{5, 6, 7, 8, 9},
{10, 11, 12, 13, 14},
{15, 16, 17, 18, 19},
{20, 21, 22, 23, 24},
{0, 5, 10, 15, 20},
{1, 6, 11, 16, 21},
{2, 7, 12, 17, 22},
{3, 8, 13, 18, 22},
{4, 9, 14, 19, 24},
{0, 6, 12, 18, 24},
{4, 8, 12, 16, 20},
}
```
## 參考來源
https://gist.github.com/jimmyliao11/6bbb5276fc8f40f31d880b9c16a84782?fbclid=IwAR1LO_yzvihoXcww0m6Q9Mf6XNo4SPQTWHpnjhiu34EJqDGmTVNE0XoYuzs