Skip to content

Instantly share code, notes, and snippets.

@palisir
Last active September 29, 2021 03:42
Show Gist options
  • Save palisir/fa6abb9efdcf1dc40a7ddba974ee4003 to your computer and use it in GitHub Desktop.
Save palisir/fa6abb9efdcf1dc40a7ddba974ee4003 to your computer and use it in GitHub Desktop.
Monty hall simulation
package main
import (
"fmt"
"time"
"math/rand"
)
const tries int = 1000000
func main() {
rand.Seed(time.Now().UnixNano())
var randArrays [tries][3]int
for i := 0; i < tries; i++ {
randArrays[i] = getRandArr()
}
winsByStaying := winsByStayingNb(randArrays)
var percentWinStaying float32 = float32(winsByStaying) / float32(tries) * 100
winsBySwitching := winsBySwitchingNb(randArrays)
var percentWinSwitching float32 = float32(winsBySwitching) / float32(tries) * 100
fmt.Printf("Running %v passes\n", tries)
fmt.Printf("Staying with initial door: %v %% (total %v)\n", percentWinStaying, winsByStaying )
fmt.Printf("Switching to new door: %v %% (total %v)\n", percentWinSwitching, winsBySwitching )
}
func winsByStayingNb(randArrays [tries][3]int) int {
wins := 0
for i := 0; i < len(randArrays); i++ {
if randArrays[i][0] == 1 {
wins++
}
}
return wins
}
func winsBySwitchingNb(randArrays [tries][3]int) int {
wins := 0
for i := 0; i < tries; i++ {
currentArr := randArrays[i]
remainingIdx := 1
if currentArr[1] == 0 {
remainingIdx = 2
}
if currentArr[remainingIdx] == 1 {
wins ++
}
}
return wins
}
func getRandArr() [3]int {
arr:= [3]int{1,0,0}
rand.Shuffle(3, func(i, j int) { arr[i], arr[j] = arr[j], arr[i] })
return arr
}package main
import (
"fmt"
"time"
"math/rand"
)
const tries int = 100000
func main() {
rand.Seed(time.Now().UnixNano())
var randArrays [tries][3]int
for i := 0; i < tries; i++ {
randArrays[i] = getRandArr()
}
winsByStaying := winsByStayingNb(randArrays)
var percentWinStaying float32 = float32(winsByStaying) / float32(tries) * 100
winsBySwitching := winsBySwitchingNb(randArrays)
var percentWinSwitching float32 = float32(winsBySwitching) / float32(tries) * 100
fmt.Printf("Running %v passes\n", tries)
fmt.Printf("Staying with initial door: %v %% (total %v)\n", percentWinStaying, winsByStaying )
fmt.Printf("Switching to new door: %v %% (total %v)\n", percentWinSwitching, winsBySwitching )
}
func winsByStayingNb(randArrays [tries][3]int) int {
wins := 0
for i := 0; i < len(randArrays); i++ {
if randArrays[i][0] == 1 {
wins++
}
}
return wins
}
func winsBySwitchingNb(randArrays [tries][3]int) int {
wins := 0
for i := 0; i < tries; i++ {
currentArr := randArrays[i]
remainingIdx := 1
if currentArr[1] == 0 {
remainingIdx = 2
}
if currentArr[remainingIdx] == 1 {
wins ++
}
}
return wins
}
func getRandArr() [3]int {
arr:= [3]int{1,0,0}
rand.Shuffle(3, func(i, j int) { arr[i], arr[j] = arr[j], arr[i] })
return arr
}package main
import (
"fmt"
"time"
"math/rand"
)
const tries int = 100000
func main() {
rand.Seed(time.Now().UnixNano())
var randArrays [tries][3]int
for i := 0; i < tries; i++ {
randArrays[i] = getRandArr()
}
winsByStaying := winsByStayingNb(randArrays)
var percentWinStaying float32 = float32(winsByStaying) / float32(tries) * 100
winsBySwitching := winsBySwitchingNb(randArrays)
var percentWinSwitching float32 = float32(winsBySwitching) / float32(tries) * 100
fmt.Printf("Running %v passes\n", tries)
fmt.Printf("Staying with initial door: %v %% (total %v)\n", percentWinStaying, winsByStaying )
fmt.Printf("Switching to new door: %v %% (total %v)\n", percentWinSwitching, winsBySwitching )
}
func winsByStayingNb(randArrays [tries][3]int) int {
wins := 0
for i := 0; i < len(randArrays); i++ {
if randArrays[i][0] == 1 {
wins++
}
}
return wins
}
func winsBySwitchingNb(randArrays [tries][3]int) int {
wins := 0
for i := 0; i < tries; i++ {
currentArr := randArrays[i]
remainingIdx := 1
if currentArr[1] == 0 {
remainingIdx = 2
}
if currentArr[remainingIdx] == 1 {
wins ++
}
}
return wins
}
func getRandArr() [3]int {
arr:= [3]int{1,0,0}
rand.Shuffle(3, func(i, j int) { arr[i], arr[j] = arr[j], arr[i] })
return arr
}
passes = 1000000
def get_random_arr
[true, false, false].shuffle
end
random_arrs = passes.times.map { get_random_arr }
wins_by_stay = random_arrs.count { |a| a[0] }
wins_by_switch = random_arrs.count { |a| a[1] || a[2] }
percent_win_by_staying = (wins_by_stay.to_f / passes.to_f * 100).round(2)
percent_win_by_switching = (wins_by_switch.to_f / passes.to_f * 100).round(2)
puts "Running #{passes} passes:"
puts "Staying with initial door: #{percent_win_by_staying}% (total #{wins_by_stay})"
puts "Switching with initial door: #{percent_win_by_switching}% (total #{wins_by_switch})"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment