September Morn Update
This commit is contained in:
parent
4e2d22a71d
commit
aac6731f2c
6856 changed files with 141342 additions and 21127 deletions
1
Task/Average-loop-length/00META.yaml
Normal file
1
Task/Average-loop-length/00META.yaml
Normal file
|
|
@ -0,0 +1 @@
|
|||
--- {}
|
||||
21
Task/Average-loop-length/Perl/average-loop-length.pl
Normal file
21
Task/Average-loop-length/Perl/average-loop-length.pl
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
use List::Util qw(sum reduce);
|
||||
|
||||
sub find_loop {
|
||||
my($n) = @_;
|
||||
my($r,@seen);
|
||||
while () { $seen[$r] = $seen[($r = int(1+rand $n))] ? return sum @seen : 1 }
|
||||
}
|
||||
|
||||
print " N empiric theoric (error)\n";
|
||||
print "=== ========= ============ =========\n";
|
||||
|
||||
my $MAX = 20;
|
||||
my $TRIALS = 1000;
|
||||
|
||||
for my $n (1 .. $MAX) {
|
||||
my $empiric = ( sum map { find_loop($n) } 1..$TRIALS ) / $TRIALS;
|
||||
my $theoric = sum map { (reduce { $a*$b } $_**2, ($n-$_+1)..$n ) / $n ** ($_+1) } 1..$n;
|
||||
|
||||
printf "%3d %9.4f %12.4f (%5.2f%%)\n",
|
||||
$n, $empiric, $theoric, 100 * ($empiric - $theoric) / $theoric;
|
||||
}
|
||||
34
Task/Average-loop-length/R/average-loop-length.r
Normal file
34
Task/Average-loop-length/R/average-loop-length.r
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
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)))
|
||||
}
|
||||
65
Task/Average-loop-length/Simula/average-loop-length.simula
Normal file
65
Task/Average-loop-length/Simula/average-loop-length.simula
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
BEGIN
|
||||
|
||||
REAL PROCEDURE FACTORIAL(N); INTEGER N;
|
||||
BEGIN
|
||||
REAL RESULT;
|
||||
INTEGER I;
|
||||
RESULT := 1.0;
|
||||
FOR I := 2 STEP 1 UNTIL N DO
|
||||
RESULT := RESULT * I;
|
||||
FACTORIAL := RESULT;
|
||||
END FACTORIAL;
|
||||
|
||||
REAL PROCEDURE ANALYTICAL (N); INTEGER N;
|
||||
BEGIN
|
||||
REAL SUM, RN;
|
||||
INTEGER I;
|
||||
RN := N;
|
||||
FOR I := 1 STEP 1 UNTIL N DO
|
||||
BEGIN
|
||||
SUM := SUM + FACTORIAL(N) / FACTORIAL(N - I) / RN ** I;
|
||||
END;
|
||||
ANALYTICAL := SUM;
|
||||
END ANALYTICAL;
|
||||
|
||||
REAL PROCEDURE EXPERIMENTAL(N); INTEGER N;
|
||||
BEGIN
|
||||
INTEGER NUM;
|
||||
INTEGER COUNT;
|
||||
INTEGER RUN;
|
||||
FOR RUN := 1 STEP 1 UNTIL TESTS DO
|
||||
BEGIN
|
||||
BOOLEAN ARRAY BITS(1:N);
|
||||
INTEGER I;
|
||||
FOR I := 1 STEP 1 UNTIL N DO
|
||||
BEGIN
|
||||
NUM := RANDINT(1,N,SEED);
|
||||
IF BITS(NUM) THEN GOTO L;
|
||||
BITS(NUM) := TRUE;
|
||||
COUNT := COUNT + 1;
|
||||
END FOR I;
|
||||
L:
|
||||
END FOR RUN;
|
||||
EXPERIMENTAL := COUNT / TESTS;
|
||||
END EXPERIMENTAL;
|
||||
|
||||
INTEGER SEED, TESTS;
|
||||
SEED := ININT;
|
||||
TESTS := 1000000;
|
||||
BEGIN
|
||||
REAL A, E, ERR;
|
||||
INTEGER I;
|
||||
OUTTEXT(" N AVG CALC %DIFF"); OUTIMAGE;
|
||||
FOR I := 1 STEP 1 UNTIL 20 DO
|
||||
BEGIN
|
||||
A := ANALYTICAL(I);
|
||||
E := EXPERIMENTAL(I);
|
||||
ERR := (ABS(E-A)/A)*100.0;
|
||||
OUTINT(I, 2);
|
||||
OUTFIX(E, 4, 7);
|
||||
OUTFIX(A, 4, 10);
|
||||
OUTFIX(ERR, 4, 10);
|
||||
OUTIMAGE;
|
||||
END FOR I;
|
||||
END;
|
||||
END
|
||||
37
Task/Average-loop-length/VBA/average-loop-length.vba
Normal file
37
Task/Average-loop-length/VBA/average-loop-length.vba
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
Const MAX = 20
|
||||
Const ITER = 1000000
|
||||
|
||||
Function expected(n As Long) As Double
|
||||
Dim sum As Double
|
||||
For i = 1 To n
|
||||
sum = sum + WorksheetFunction.Fact(n) / n ^ i / WorksheetFunction.Fact(n - i)
|
||||
Next i
|
||||
expected = sum
|
||||
End Function
|
||||
|
||||
Function test(n As Long) As Double
|
||||
Dim count As Long
|
||||
Dim x As Long, bits As Long
|
||||
For i = 1 To ITER
|
||||
x = 1
|
||||
bits = 0
|
||||
Do While Not bits And x
|
||||
count = count + 1
|
||||
bits = bits Or x
|
||||
x = 2 ^ (Int(n * Rnd()))
|
||||
Loop
|
||||
Next i
|
||||
test = count / ITER
|
||||
End Function
|
||||
|
||||
Public Sub main()
|
||||
Dim n As Long
|
||||
Debug.Print " n avg. exp. (error%)"
|
||||
Debug.Print "== ====== ====== ========"
|
||||
For n = 1 To MAX
|
||||
av = test(n)
|
||||
ex = expected(n)
|
||||
Debug.Print Format(n, "@@"); " "; Format(av, "0.0000"); " ";
|
||||
Debug.Print Format(ex, "0.0000"); " ("; Format(Abs(1 - av / ex), "0.000%"); ")"
|
||||
Next n
|
||||
End Sub
|
||||
Loading…
Add table
Add a link
Reference in a new issue