diff --git a/main.go b/main.go index 0d1e059..0372933 100644 --- a/main.go +++ b/main.go @@ -7,37 +7,46 @@ import ( ) func main() { + // Random seed based on time when program runs rand.Seed(time.Now().UTC().UnixNano()) - var balance, investedPercentage, winningPercentage float64 - balance = 100 + // Initialize variables + var startingBalance, investedPercentage, winningPercentage float64 + startingBalance = 100 investedPercentage = 0.80 winningPercentage = 0.70 discreteCompoundingPeriods := 200 numSimulations := 16 outputChannel := make(chan float64) + // Start simulations for i := 0; i < numSimulations; i++ { - go simulation(balance, investedPercentage, winningPercentage, discreteCompoundingPeriods, outputChannel) + go simulation(startingBalance, investedPercentage, winningPercentage, discreteCompoundingPeriods, outputChannel) } + // Wait for simulations to finish and write output for i := 0; i < numSimulations; i++ { fmt.Println(<-outputChannel) } - } +// discrete period, symmetric payoff simulator func simulation(startingBalance, investedPercentage, winningPercentage float64, discreteCompoundingPeriods int, outputChannel chan float64) { balance := startingBalance + + // Each iteration is one bet for i := 0; i < discreteCompoundingPeriods; i++ { - investedAmount := balance * investedPercentage + // Each bet is a fixed percentage of the balance + betAmount := balance * investedPercentage if rand.Float64() <= winningPercentage { // you win - balance += investedAmount + balance += betAmount } else { // you lose - balance -= investedAmount + balance -= betAmount } } + + // Calculate and report the result on the outputChannel outputChannel <- (balance / startingBalance) }