RosettaCodeData/Task/Average-loop-length/Wren/average-loop-length.wren

41 lines
832 B
Plaintext

import "random" for Random
import "./fmt" for Fmt
var nmax = 20
var rand = Random.new()
var avg = Fn.new { |n|
var tests = 1e4
var sum = 0
for (t in 0...tests) {
var v = List.filled(nmax, false)
var x = 0
while (!v[x]) {
v[x] = true
sum = sum + 1
x = rand.int(n)
}
}
return sum/tests
}
var ana = Fn.new { |n|
if (n < 2) return 1
var term = 1
var sum = 1
for (i in n-1..1) {
term = term * i / n
sum = sum + term
}
return sum
}
System.print(" N average analytical (error)")
System.print("=== ========= ============ =========")
for (n in 1..nmax) {
var a = avg.call(n)
var b = ana.call(n)
var e = (a - b).abs/ b * 100
Fmt.print("$3d $9.4f $12.4f ($6.2f\%)", n, a, b, e)
}