Skip to content

Instantly share code, notes, and snippets.

@disksing
Created February 5, 2020 08:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save disksing/85618a72e65bb970d9209a69f34a5e52 to your computer and use it in GitHub Desktop.
Save disksing/85618a72e65bb970d9209a69f34a5e52 to your computer and use it in GitHub Desktop.
Monte Carlo Experiment
For blog post http://disksing.com/failure-probability-analysis/
package main
import (
"fmt"
"math/rand"
"time"
)
var estimated float64 = 0.5
func sim() float64 {
return rand.Float64()
}
func main() {
rand.Seed(time.Now().UnixNano())
var sum float64
for count := 1; ; count++ {
sum += sim()
if count%100 == 0 {
mean := sum / float64(count)
deviation := (mean - estimated) / estimated * 100
fmt.Printf("iteration=%d mean=%.10f deviation=%+.2f%%\n", count, mean, deviation)
}
}
}
iteration=100 mean=0.4663998716 deviation=-6.72%
iteration=200 mean=0.5109202400 deviation=+2.18%
iteration=300 mean=0.5026777399 deviation=+0.54%
iteration=400 mean=0.5083896952 deviation=+1.68%
iteration=500 mean=0.5116018940 deviation=+2.32%
iteration=600 mean=0.5107747885 deviation=+2.15%
iteration=700 mean=0.5073597136 deviation=+1.47%
iteration=800 mean=0.5069279983 deviation=+1.39%
iteration=900 mean=0.5061784518 deviation=+1.24%
iteration=1000 mean=0.5041838735 deviation=+0.84%
iteration=2000 mean=0.4990415218 deviation=-0.19%
iteration=3000 mean=0.4996433742 deviation=-0.07%
iteration=4000 mean=0.4976057349 deviation=-0.48%
iteration=5000 mean=0.4966866840 deviation=-0.66%
iteration=6000 mean=0.4971638614 deviation=-0.57%
iteration=7000 mean=0.4977187387 deviation=-0.46%
iteration=8000 mean=0.4983605065 deviation=-0.33%
iteration=9000 mean=0.4971227640 deviation=-0.58%
iteration=10000 mean=0.4977224693 deviation=-0.46%
iteration=20000 mean=0.4973611526 deviation=-0.53%
iteration=30000 mean=0.4978345476 deviation=-0.43%
iteration=40000 mean=0.4990125022 deviation=-0.20%
iteration=50000 mean=0.4994612727 deviation=-0.11%
iteration=60000 mean=0.5003711147 deviation=+0.07%
iteration=70000 mean=0.5006150357 deviation=+0.12%
iteration=80000 mean=0.5007202937 deviation=+0.14%
iteration=90000 mean=0.5001577054 deviation=+0.03%
iteration=100000 mean=0.5004349331 deviation=+0.09%
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
var (
N = 20
λ = 0.05
totalTick = 365 * 24 * 60
failRatePerTick = 1 - math.Exp(-1*λ/float64(totalTick))
)
var estimated float64 = λ
func sim() float64 {
var failCount float64
for i := 1; i <= totalTick; i++ {
for j := 0; j < N; j++ {
if rand.Float64() < failRatePerTick {
failCount++
}
}
}
return failCount / float64(N)
}
func main() {
rand.Seed(time.Now().UnixNano())
var sum float64
for count := 1; ; count++ {
sum += sim()
if count%100 == 0 {
mean := sum / float64(count)
deviation := (mean - estimated) / estimated * 100
fmt.Printf("iteration=%d mean=%.10f deviation=%+.2f%%\n", count, mean, deviation)
}
}
}
iteration=100 mean=0.0370000000 deviation=-26.00%
iteration=200 mean=0.0435000000 deviation=-13.00%
iteration=300 mean=0.0476666667 deviation=-4.67%
iteration=400 mean=0.0473750000 deviation=-5.25%
iteration=500 mean=0.0480000000 deviation=-4.00%
iteration=600 mean=0.0488333333 deviation=-2.33%
iteration=700 mean=0.0490714286 deviation=-1.86%
iteration=800 mean=0.0498750000 deviation=-0.25%
iteration=900 mean=0.0488333333 deviation=-2.33%
iteration=1000 mean=0.0491500000 deviation=-1.70%
iteration=2000 mean=0.0485500000 deviation=-2.90%
iteration=3000 mean=0.0491666667 deviation=-1.67%
iteration=4000 mean=0.0491125000 deviation=-1.77%
iteration=5000 mean=0.0498600000 deviation=-0.28%
iteration=6000 mean=0.0498000000 deviation=-0.40%
iteration=7000 mean=0.0497285714 deviation=-0.54%
iteration=8000 mean=0.0499500000 deviation=-0.10%
iteration=9000 mean=0.0501666667 deviation=+0.33%
iteration=10000 mean=0.0502600000 deviation=+0.52%
iteration=20000 mean=0.0503150000 deviation=+0.63%
iteration=30000 mean=0.0502033333 deviation=+0.41%
iteration=40000 mean=0.0500250000 deviation=+0.05%
iteration=50000 mean=0.0498760000 deviation=-0.25%
iteration=60000 mean=0.0499533333 deviation=-0.09%
iteration=70000 mean=0.0499942857 deviation=-0.01%
iteration=80000 mean=0.0499462500 deviation=-0.11%
iteration=90000 mean=0.0500022222 deviation=+0.00%
iteration=100000 mean=0.0499650000 deviation=-0.07%
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
const (
N = 20
λ = 0.05
tickYear = 365 * 24 * 60
)
var p0 = 1 - math.Exp(-1*λ/tickYear)
var estimated = 1 - math.Exp(-1*λ*N)
func sim() float64 {
for i := 1; i <= tickYear; i++ {
for j := 0; j < N; j++ {
if rand.Float64() < p0 {
return 1.0
}
}
}
return 0
}
func main() {
rand.Seed(time.Now().UnixNano())
var sum float64
for count := 1; ; count++ {
sum += sim()
if count%100 == 0 {
mean := sum / float64(count)
deviation := (mean - estimated) / estimated * 100
fmt.Printf("iteration=%d mean=%.10f deviation=%+.2f%%\n", count, mean, deviation)
}
}
}
iteration=100 mean=0.6900000000 deviation=+9.16%
iteration=200 mean=0.6050000000 deviation=-4.29%
iteration=300 mean=0.5933333333 deviation=-6.14%
iteration=400 mean=0.6125000000 deviation=-3.10%
iteration=500 mean=0.6180000000 deviation=-2.23%
iteration=600 mean=0.6233333333 deviation=-1.39%
iteration=700 mean=0.6314285714 deviation=-0.11%
iteration=800 mean=0.6287500000 deviation=-0.53%
iteration=900 mean=0.6277777778 deviation=-0.69%
iteration=1000 mean=0.6320000000 deviation=-0.02%
iteration=2000 mean=0.6295000000 deviation=-0.41%
iteration=3000 mean=0.6366666667 deviation=+0.72%
iteration=4000 mean=0.6297500000 deviation=-0.38%
iteration=5000 mean=0.6312000000 deviation=-0.15%
iteration=6000 mean=0.6306666667 deviation=-0.23%
iteration=7000 mean=0.6301428571 deviation=-0.31%
iteration=8000 mean=0.6322500000 deviation=+0.02%
iteration=9000 mean=0.6322222222 deviation=+0.02%
iteration=10000 mean=0.6330000000 deviation=+0.14%
iteration=20000 mean=0.6302000000 deviation=-0.30%
iteration=30000 mean=0.6313333333 deviation=-0.12%
iteration=40000 mean=0.6321000000 deviation=-0.00%
iteration=50000 mean=0.6325000000 deviation=+0.06%
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
const (
N = 20
λ = 0.05
tickYear = 365 * 24 * 60
recoverTick = 24 * 60
)
var p0 = 1 - math.Exp(-1*λ/tickYear)
var estimated = 1 - math.Exp(-1*N*N*λ*λ*(1.0*recoverTick/(tickYear)))
func sim() float64 {
var lastFail int
for i := 1; i <= tickYear; i++ {
for j := 0; j < N; j++ {
if rand.Float64() < p0 {
if lastFail > 0 && i-lastFail < recoverTick {
return 1.0
}
lastFail = i
}
}
}
return 0
}
func main() {
rand.Seed(time.Now().UnixNano())
var sum float64
for count := 1; ; count++ {
sum += sim()
if count%100 == 0 {
mean := sum / float64(count)
deviation := (mean - estimated) / estimated * 100
fmt.Printf("iteration=%d mean=%.10f deviation=%+.2f%%\n", count, mean, deviation)
}
}
}
iteration=100 mean=0.0100000000 deviation=+265.50%
iteration=200 mean=0.0050000000 deviation=+82.75%
iteration=300 mean=0.0066666667 deviation=+143.67%
iteration=400 mean=0.0075000000 deviation=+174.13%
iteration=500 mean=0.0060000000 deviation=+119.30%
iteration=600 mean=0.0050000000 deviation=+82.75%
iteration=700 mean=0.0057142857 deviation=+108.86%
iteration=800 mean=0.0050000000 deviation=+82.75%
iteration=900 mean=0.0044444444 deviation=+62.44%
iteration=1000 mean=0.0050000000 deviation=+82.75%
iteration=2000 mean=0.0040000000 deviation=+46.20%
iteration=3000 mean=0.0033333333 deviation=+21.83%
iteration=4000 mean=0.0035000000 deviation=+27.93%
iteration=5000 mean=0.0030000000 deviation=+9.65%
iteration=6000 mean=0.0028333333 deviation=+3.56%
iteration=7000 mean=0.0027142857 deviation=-0.79%
iteration=8000 mean=0.0028750000 deviation=+5.08%
iteration=9000 mean=0.0028888889 deviation=+5.59%
iteration=10000 mean=0.0029000000 deviation=+6.00%
iteration=20000 mean=0.0032500000 deviation=+18.79%
iteration=30000 mean=0.0029333333 deviation=+7.21%
iteration=40000 mean=0.0030000000 deviation=+9.65%
iteration=50000 mean=0.0029600000 deviation=+8.19%
iteration=60000 mean=0.0027833333 deviation=+1.73%
iteration=70000 mean=0.0028000000 deviation=+2.34%
iteration=80000 mean=0.0026875000 deviation=-1.77%
iteration=90000 mean=0.0026444444 deviation=-3.35%
iteration=100000 mean=0.0026600000 deviation=-2.78%
iteration=200000 mean=0.0027100000 deviation=-0.95%
iteration=300000 mean=0.0027533333 deviation=+0.63%
iteration=400000 mean=0.0028025000 deviation=+2.43%
iteration=500000 mean=0.0027260000 deviation=-0.36%
iteration=600000 mean=0.0027300000 deviation=-0.22%
iteration=700000 mean=0.0027300000 deviation=-0.22%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment