Average loop length: Difference between revisions

Added R code
(Added R code)
Line 1,750:
19 5.1534 5.1522 0.024%
20 5.2927 5.2936 -0.017%</pre>
=={{header|R}}==
<lang R>
expected <- function(size) {
result <- 0
for (i in 1:size) {
result <- result + factorial(size) / size^i / factorial(size -i)
}
result
}
 
knuth <- function(size) {
v <- sample(1:size, size, replace = TRUE)
visit <- vector('logical',size)
place <- 1
visit[[1]] <- TRUE
steps <- 0
repeat {
place <- v[[place]]
steps <- steps + 1
if (visit[[place]]) break
visit[[place]] <- TRUE
}
steps
}
 
cat(" N average analytical (error)\n")
cat("=== ========= ============ ==========\n")
for (num in 1:20) {
average <- mean(replicate(1e6, knuth(num)))
analytical <- expected(num)
error <- abs(average/analytical-1)*100
cat(sprintf("%3d%11.4f%14.4f ( %4.4f%%)\n", num, round(average,4), round(analytical,4), round(error,2)))
}
</lang>
 
{{out}}
<pre>
N average analytical (error)
=== ========= ============ ==========
1 1.0000 1.0000 ( 0.0000%)
2 1.5002 1.5000 ( 0.0100%)
3 1.8892 1.8889 ( 0.0100%)
4 2.2190 2.2188 ( 0.0100%)
5 2.5108 2.5104 ( 0.0200%)
6 2.7751 2.7747 ( 0.0200%)
7 3.0177 3.0181 ( 0.0100%)
8 3.2472 3.2450 ( 0.0700%)
9 3.4582 3.4583 ( 0.0000%)
10 3.6600 3.6602 ( 0.0100%)
11 3.8530 3.8524 ( 0.0200%)
12 4.0366 4.0361 ( 0.0100%)
13 4.2085 4.2123 ( 0.0900%)
14 4.3814 4.3820 ( 0.0100%)
15 4.5446 4.5458 ( 0.0300%)
16 4.7063 4.7043 ( 0.0400%)
17 4.8555 4.8579 ( 0.0500%)
18 5.0099 5.0071 ( 0.0600%)
19 5.1567 5.1522 ( 0.0900%)
20 5.2940 5.2936 ( 0.0100%)
</pre>
 
=={{header|Racket}}==