Data update
This commit is contained in:
parent
4bb20c9b71
commit
cbaf4c4b64
12390 changed files with 318560 additions and 27248 deletions
53
Task/Average-loop-length/Ada/average-loop-length.adb
Normal file
53
Task/Average-loop-length/Ada/average-loop-length.adb
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
with Ada.Numerics.Generic_Elementary_Functions;
|
||||
with Ada.Numerics.Discrete_Random;
|
||||
procedure Avglen is
|
||||
package IIO is new Ada.Text_IO.Integer_IO (Positive); use IIO;
|
||||
package LFIO is new Ada.Text_IO.Float_IO (Long_Float); use LFIO;
|
||||
subtype FactN is Natural range 0..20;
|
||||
TESTS : constant Natural := 1_000_000;
|
||||
|
||||
function Factorial (N : FactN) return Long_Float is
|
||||
Result : Long_Float := 1.0;
|
||||
begin
|
||||
for I in 2..N loop Result := Result * Long_Float(I); end loop;
|
||||
return Result;
|
||||
end Factorial;
|
||||
|
||||
function Analytical (N : FactN) return Long_Float is
|
||||
Sum : Long_Float := 0.0;
|
||||
begin
|
||||
for I in 1..N loop
|
||||
Sum := Sum + Factorial(N) / Factorial(N - I) / Long_Float(N)**I;
|
||||
end loop;
|
||||
return Sum;
|
||||
end Analytical;
|
||||
|
||||
function Experimental (N : FactN) return Long_Float is
|
||||
subtype RandInt is Natural range 1..N;
|
||||
package Random is new Ada.Numerics.Discrete_Random(RandInt);
|
||||
seed : Random.Generator;
|
||||
Num : RandInt;
|
||||
count : Natural := 0;
|
||||
bits : array(RandInt'Range) of Boolean;
|
||||
begin
|
||||
Random.Reset(seed);
|
||||
for run in 1..TESTS loop
|
||||
bits := (others => false);
|
||||
for I in RandInt'Range loop
|
||||
Num := Random.Random(seed); exit when bits(Num);
|
||||
bits(Num) := True; count := count + 1;
|
||||
end loop;
|
||||
end loop;
|
||||
return Long_Float(count)/Long_Float(TESTS);
|
||||
end Experimental;
|
||||
|
||||
A, E, err : Long_Float;
|
||||
begin
|
||||
Put_Line(" N avg calc %diff");
|
||||
for I in 1..20 loop
|
||||
A := Analytical(I); E := Experimental(I); err := abs(E-A)/A*100.0;
|
||||
Put(I, Width=>2); Put(E ,Aft=>4, exp=>0); Put(A, Aft=>4, exp=>0);
|
||||
Put(err, Fore=>3, Aft=>3, exp=>0); New_line;
|
||||
end loop;
|
||||
end Avglen;
|
||||
26
Task/Average-loop-length/Crystal/average-loop-length.cr
Normal file
26
Task/Average-loop-length/Crystal/average-loop-length.cr
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
struct Int
|
||||
def factorial
|
||||
raise "only positive" if self < 0
|
||||
(1_i64..self.to_i64).product
|
||||
end
|
||||
end
|
||||
|
||||
def rand_until_rep (n)
|
||||
rands = {} of Int32 => Bool
|
||||
loop do
|
||||
r = rand(1..n)
|
||||
return rands.size if rands[r]?
|
||||
rands[r] = true
|
||||
end
|
||||
end
|
||||
|
||||
runs = 1_000_000
|
||||
|
||||
puts " N average exp. diff ",
|
||||
"=== ======== ======== ==========="
|
||||
(1..20).each do |n|
|
||||
sum_of_runs = runs.times.sum(0_i64) { rand_until_rep(n) }
|
||||
avg = sum_of_runs / runs
|
||||
analytical = (1..n).sum(0.0) {|i| (n.factorial / (n.to_f**i) / (n-i).factorial) }
|
||||
puts "%3d %8.4f %8.4f (%8.4f%%)" % {n, avg, analytical, (avg/analytical - 1)*100}
|
||||
end
|
||||
|
|
@ -3,7 +3,7 @@ fastfunc average n reps .
|
|||
len seen[] n
|
||||
for r to reps
|
||||
for i = 1 to n
|
||||
f[i] = random n
|
||||
f[i] = random 1 n
|
||||
seen[i] = 0
|
||||
.
|
||||
x = 1
|
||||
|
|
|
|||
39
Task/Average-loop-length/Pluto/average-loop-length.pluto
Normal file
39
Task/Average-loop-length/Pluto/average-loop-length.pluto
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
require "table2"
|
||||
local fmt = require "fmt"
|
||||
|
||||
local nmax <const> = 20
|
||||
|
||||
local function avg(n)
|
||||
local tests = 1e4
|
||||
local sum = 0
|
||||
for _ = 1, tests do
|
||||
local v = table.rep(nmax, false)
|
||||
local x = 1
|
||||
while !v[x] do
|
||||
v[x] = true
|
||||
sum += 1
|
||||
x = math.random(1, n)
|
||||
end
|
||||
end
|
||||
return sum / tests
|
||||
end
|
||||
|
||||
local function ana(n)
|
||||
if n < 2 then return 1 end
|
||||
local term = 1
|
||||
local sum = 1
|
||||
for i = n, 2, -1 do
|
||||
term *= (i - 1) / n
|
||||
sum += term
|
||||
end
|
||||
return sum
|
||||
end
|
||||
|
||||
print(" N average analytical (error)")
|
||||
print("=== ========= ============ =========")
|
||||
for n = 1, nmax do
|
||||
local a = avg(n)
|
||||
local b = ana(n)
|
||||
local e = math.abs(a - b) / b * 100
|
||||
fmt.print("%3d %9.4f %12.4f (%6.2f%%)", n, a, b, e)
|
||||
end
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
function Get-AnalyticalLoopAverage ( [int]$N )
|
||||
{
|
||||
# Expected loop average = sum from i = 1 to N of N! / (N-i)! / N^(N-i+1)
|
||||
# Equivalently, Expected loop average = sum from i = 1 to N of F(i)
|
||||
# where F(N) = 1, and F(i) = F(i+1)*i/N
|
||||
|
||||
$LoopAverage = $Fi = 1
|
||||
|
||||
If ( $N -eq 1 ) { return $LoopAverage }
|
||||
|
||||
ForEach ( $i in ($N-1)..1 )
|
||||
{
|
||||
$Fi *= $i / $N
|
||||
$LoopAverage += $Fi
|
||||
}
|
||||
return $LoopAverage
|
||||
}
|
||||
|
||||
function Get-ExperimentalLoopAverage ( [int]$N, [int]$Tests = 100000 )
|
||||
{
|
||||
If ( $N -eq 1 ) { return 1 }
|
||||
|
||||
# Using 0 through N-1 instead of 1 through N for speed and simplicity
|
||||
$NMO = $N - 1
|
||||
|
||||
# Create array to hold mapping function
|
||||
$F = New-Object int[] ( $N )
|
||||
|
||||
$Count = 0
|
||||
$Random = New-Object System.Random
|
||||
|
||||
ForEach ( $Test in 1..$Tests )
|
||||
{
|
||||
# Map each number to a random number
|
||||
ForEach ( $i in 0..$NMO )
|
||||
{
|
||||
$F[$i] = $Random.Next( $N )
|
||||
}
|
||||
|
||||
# For each number...
|
||||
ForEach ( $i in 0..$NMO )
|
||||
{
|
||||
# Add the number to the list
|
||||
$List = @()
|
||||
$Count++
|
||||
$List += $X = $i
|
||||
|
||||
# If loop does not yet exist in list...
|
||||
While ( $F[$X] -notin $List )
|
||||
{
|
||||
# Go to the next mapped number and add it to the list
|
||||
$Count++
|
||||
$List += $X = $F[$X]
|
||||
}
|
||||
}
|
||||
}
|
||||
$LoopAvereage = $Count / $N / $Tests
|
||||
return $LoopAvereage
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
# Display results for N = 1 through 20
|
||||
ForEach ( $N in 1..20 )
|
||||
{
|
||||
$AnalyticalAverage = Get-AnalyticalLoopAverage $N
|
||||
$ExperimentalAverage = Get-ExperimentalLoopAverage $N
|
||||
[pscustomobject] @{
|
||||
N = $N.ToString().PadLeft( 2, ' ' )
|
||||
Analytical = $AnalyticalAverage.ToString( '0.00000000' )
|
||||
Experimental = $ExperimentalAverage.ToString( '0.00000000' )
|
||||
'Error (%)' = ( [math]::Abs( $AnalyticalAverage - $ExperimentalAverage ) / $AnalyticalAverage * 100 ).ToString( '0.00000000' )
|
||||
}
|
||||
}
|
||||
48
Task/Average-loop-length/VBScript/average-loop-length.vbs
Normal file
48
Task/Average-loop-length/VBScript/average-loop-length.vbs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
Const MAX = 20
|
||||
Const ITER = 100000
|
||||
|
||||
Function expected(n)
|
||||
Dim sum
|
||||
ni=n
|
||||
For i = 1 To n
|
||||
sum = sum + fact(n) / ni / fact(n-i)
|
||||
ni=ni*n
|
||||
Next
|
||||
expected = sum
|
||||
End Function
|
||||
|
||||
Function test(n )
|
||||
Dim coun,x,bits
|
||||
For i = 1 To ITER
|
||||
x = 1
|
||||
bits = 0
|
||||
Do While Not bits And x
|
||||
count = count + 1
|
||||
bits = bits Or x
|
||||
x =shift(Int(n * Rnd()))
|
||||
Loop
|
||||
Next
|
||||
test = count / ITER
|
||||
End Function
|
||||
|
||||
'VBScript formats numbers but does'nt align them!
|
||||
function rf(v,n,s) rf=right(string(n,s)& v,n):end function
|
||||
|
||||
'some precalculations to speed things up...
|
||||
dim fact(20),shift(20)
|
||||
fact(0)=1:shift(0)=1
|
||||
for i=1 to 20
|
||||
fact(i)=i*fact(i-1)
|
||||
shift(i)=2*shift(i-1)
|
||||
next
|
||||
|
||||
Dim n
|
||||
Wscript.echo "For " & ITER &" iterations"
|
||||
Wscript.Echo " n avg. exp. (error%)"
|
||||
Wscript.Echo "== ====== ====== =========="
|
||||
For n = 1 To MAX
|
||||
av = test(n)
|
||||
ex = expected(n)
|
||||
Wscript.Echo rf(n,2," ")& " "& rf(formatnumber(av, 4),7," ") & " "& _
|
||||
rf(formatnumber(ex,4),6," ")& " ("& rf(Formatpercent(1 - av / ex,4),8," ") & ")"
|
||||
Next
|
||||
Loading…
Add table
Add a link
Reference in a new issue