Last active
September 29, 2021 03:42
-
-
Save palisir/fa6abb9efdcf1dc40a7ddba974ee4003 to your computer and use it in GitHub Desktop.
Monty hall simulation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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