29 lines
807 B
Text
29 lines
807 B
Text
let mean = 1.0
|
|
let stdv = 0.5
|
|
let count = 1000
|
|
|
|
// stats computes a running mean and variance
|
|
// See Knuth TAOCP vol 2, 3rd edition, page 232
|
|
|
|
def stats(xs: [float]) -> float, float: // variance, mean
|
|
var M = xs[0]
|
|
var S = 0.0
|
|
var n = 1.0
|
|
for(xs.length - 1) i:
|
|
let x = xs[i + 1]
|
|
n = n + 1.0
|
|
let mm = (x - M)
|
|
M += mm / n
|
|
S += mm * (x - M)
|
|
return (if n > 0.0: S / n else: 0.0), M
|
|
|
|
def test_random_normal() -> [float]:
|
|
rnd_seed(floor(seconds_elapsed() * 1000000))
|
|
let r = vector_reserve(typeof return, count)
|
|
for (count):
|
|
r.push(rnd_gaussian() * stdv + mean)
|
|
let cvar, cmean = stats(r)
|
|
let cstdv = sqrt(cvar)
|
|
print concat_string(["Mean: ", string(cmean), ", Std.Deviation: ", string(cstdv)], "")
|
|
|
|
test_random_normal()
|