123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- --[[ https://en.wikipedia.org/wiki/Normal_distribution ]]
-
- -- The Box–Muller method
- local function gaussian(mean, variance)
- local U = math.random()
- local V = math.random()
- return math.sqrt(-2.0 * variance * math.log(U)) *
- math.cos(2.0 * math.pi * V) + mean
- end
-
- local function mean(t)
- local sum = 0
- local count = #t
- for i = 1, count do
- sum = sum + t[i]
- end
- return sum / count
- end
-
- local function std(t, mean)
- local squares = 0.0
- for i = 1, #t do
- local deviation = math.abs(mean - t[i])
- squares = squares + deviation * deviation
- end
- local variance = squares / #t
- return math.sqrt(variance)
- end
-
- local function do_the_call()
- local t = {}
- local mu = 34.0
- local sigma = 10.0
-
- for i = 1, 5 do
- table.insert(t, gaussian(mu, sigma))
- end
-
- return string.format("Got mean: %1.5f, mu: %1.5f\nstd deviance:%1.5f, expected: %1.5f",
- mean(t), mu,
- std(t, mu), math.sqrt(sigma))
- end
-
- math.randomseed(os.time())
- return do_the_call
|