| YaK:: rolling a die | [Changes] [Calendar] [Search] [Index] [PhotoTags] |
$ cat simulate-dice.go
package main
import (
"crypto/rand"
"fmt"
"math/big"
)
const SIX = 6
const NROLLS = 8194
const NTRIALS = 10000
const WAYOFF = 264
func Roll() int {
six := big.NewInt(SIX)
roll, err := rand.Int(rand.Reader, six)
if err != nil { panic(err) }
return int(roll.Int64())
}
func Trial() int {
var pairs [SIX][SIX]int
for i := 0; i < NROLLS; i++ {
preroll := i % SIX; // TODO: NROLLS is not divisible by 6.
roll := Roll();
pairs[preroll][roll]++
}
max := 0
for i := 0; i < SIX; i++ {
for j := 0; j < SIX; j++ {
if pairs[i][j] > max {
max = pairs[i][j]
}
}
}
return max
}
func main() {
wayoff := 0
for i := 0; i < NTRIALS; i++ {
max := Trial();
// fmt.Printf("%d: %d\n", i, max)
if max >= 264 {
wayoff++
}
}
fmt.Printf("%d / %d = %.6f%% were way off.\n",
wayoff, NTRIALS,
float64(wayoff) / float64(NTRIALS) * 100.0);
}
$ time go run simulate-dice.go
1705 / 10000 = 17.050000% were way off.
real 1m38.216s
user 1m39.623s
sys 0m1.054s
|
| (last modified 2019-07-08) [Login] |