Average loop length: Difference between revisions

Added Wren
m (→‎{{header|D}}: Fix link: Perl 6 --> Raku)
(Added Wren)
Line 2,756:
19 5,1530 5,1522 (0,016%)
20 5,2958 5,2936 (0,041%)</pre>
 
=={{header|Wren}}==
{{trans|Go}}
<lang ecmascript>import "random" for Random
 
var rset = Fn.new { |m, n|
var s = "%(n)"
var c = s.count
return (m > c) ? " " * (m - c) + s : s
}
 
var toPlaces = Fn.new { |n, p|
var pw = 10.pow(p)
n = (n * pw).round / pw
if (n.isInteger) return "%(n)." + "0" * p
var ns = "%(n)"
var c = ns.count
var ix = ns.indexOf(".")
var z = p - c + ix + 1
if (z > 0) ns = ns + "0" * z
return ns
}
 
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 ns = rset.call(3, n)
var as = rset.call(9, toPlaces.call(a, 4))
var bs = rset.call(12, toPlaces.call(b, 4))
var e = (a - b).abs/ b * 100
var es = rset.call(6, toPlaces.call(e, 2))
System.print("%(ns) %(as) %(bs) (%(es)\%)")
}</lang>
 
{{out}}
Sample output:
<pre>
N average analytical (error)
=== ========= ============ =========
1 1.0000 1.0000 ( 0.00%)
2 1.4967 1.5000 ( 0.22%)
3 1.8970 1.8889 ( 0.43%)
4 2.2151 2.2188 ( 0.16%)
5 2.5044 2.5104 ( 0.24%)
6 2.7884 2.7747 ( 0.49%)
7 3.0356 3.0181 ( 0.58%)
8 3.2468 3.2450 ( 0.05%)
9 3.4692 3.4583 ( 0.31%)
10 3.6538 3.6602 ( 0.18%)
11 3.8325 3.8524 ( 0.52%)
12 4.0674 4.0361 ( 0.78%)
13 4.2199 4.2123 ( 0.18%)
14 4.3808 4.3820 ( 0.03%)
15 4.5397 4.5458 ( 0.13%)
16 4.6880 4.7043 ( 0.35%)
17 4.8554 4.8579 ( 0.05%)
18 5.0311 5.0071 ( 0.48%)
19 5.1577 5.1522 ( 0.11%)
20 5.2995 5.2936 ( 0.11%)
</pre>
 
=={{header|zkl}}==
9,482

edits