Percolation/Mean run density: Difference between revisions

m
m (→‎{{header|Phix}}: syntax coloured)
m (→‎{{header|Wren}}: Minor tidy)
 
(8 intermediate revisions by 5 users not shown)
Line 31:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">UInt32 seed = 0
F nonrandom()
:seed = 1664525 * :seed + 1013904223
Line 42:
 
F runs(v)
R sum(zip(v, v[1..] [+] [0]).map((a, b) -> (a [&] (-)~b)))
 
F mean_run_density(n, p)
Line 55:
V sim = sum((0 .< t).map(i -> mean_run_density(@n, :p))) / t
print(‘t=#3 p=#.2 n=#5 p(1-p)=#.3 sim=#.3 delta=#.1%’.format(
t, p, n, limit, sim, I limit {abs(sim - limit) / limit * 100} E sim * 100))</langsyntaxhighlight>
 
{{out}}
Line 79:
t=500 p=0.90 n= 4096 p(1-p)=0.090 sim=0.090 delta=0.0%
t=500 p=0.90 n=16384 p(1-p)=0.090 sim=0.090 delta=0.0%
</pre>
 
=={{header|ALGOL 68}}==
{{Trans|C}}
<syntaxhighlight lang="algol68">
BEGIN
 
# just generate 0s and 1s without storing them #
PROC run test = ( REAL p, INT len, runs )REAL:
BEGIN
INT count := 0;
REAL thresh = p;
TO runs DO
INT x := 0;
FOR i FROM len BY -1 TO 1 DO
INT y = ABS ( random < thresh );
count +:= ABS ( x < y );
x := y
OD
OD;
count / runs / len
END # run test # ;
 
print( ( "running 1000 tests each:", newline ) );
print( ( " p n K p(1-p) diff", newline ) );
print( ( "----------------------------------------------", newline ) );
FOR ip BY 2 TO 9 DO
REAL p = ip / 10;
REAL p1p = p * (1 - p);
INT n := 10;
WHILE ( n *:= 10 ) <= 100000 DO
REAL k = run test( p, n, 1000 );
print( ( fixed( p, -4, 1 ), whole( n, -9 ), fixed( k, -8, 4 )
, fixed( p1p, -8, 4 ), fixed( k - p1p, 9, 4 )
, " (", fixed( ( k - p1p ) / p1p * 100, 5, 2 ), "%)", newline
)
)
OD;
print( ( newline ) )
OD
END
</syntaxhighlight>
{{out}}
<pre>
running 1000 tests each:
p n K p(1-p) diff
----------------------------------------------
0.1 100 0.0898 0.0900 -0.0002 (-0.21%)
0.1 1000 0.0902 0.0900 +0.0002 (+0.20%)
0.1 10000 0.0900 0.0900 +0.0000 (+0.05%)
0.1 100000 0.0900 0.0900 +0.0000 (+0.04%)
 
0.3 100 0.2105 0.2100 +0.0005 (+0.22%)
0.3 1000 0.2098 0.2100 -0.0002 (-0.12%)
0.3 10000 0.2100 0.2100 +0.0000 (+0.02%)
0.3 100000 0.2101 0.2100 +0.0001 (+0.03%)
 
0.5 100 0.2536 0.2500 +0.0035 (+1.42%)
0.5 1000 0.2504 0.2500 +0.0004 (+0.16%)
0.5 10000 0.2501 0.2500 +0.0001 (+0.03%)
0.5 100000 0.2500 0.2500 +0.0000 (+0.01%)
 
0.7 100 0.2155 0.2100 +0.0055 (+2.60%)
0.7 1000 0.2107 0.2100 +0.0007 (+0.33%)
0.7 10000 0.2101 0.2100 +0.0001 (+0.06%)
0.7 100000 0.2100 0.2100 -0.0000 (-0.02%)
 
0.9 100 0.0982 0.0900 +0.0082 (+9.12%)
0.9 1000 0.0902 0.0900 +0.0002 (+0.27%)
0.9 10000 0.0901 0.0900 +0.0001 (+0.11%)
0.9 100000 0.0900 0.0900 +0.0000 (+0.01%)
</pre>
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 117 ⟶ 188:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 150 ⟶ 221:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <random>
#include <vector>
Line 205 ⟶ 276:
}
return 0 ;
}</langsyntaxhighlight>
{{out}}
<pre>t = 100
Line 237 ⟶ 308:
=={{header|D}}==
{{trans|python}}
<langsyntaxhighlight lang="d">import std.stdio, std.range, std.algorithm, std.random, std.math;
 
enum n = 100, p = 0.5, t = 500;
Line 259 ⟶ 330:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>t=500, p=0.10, n= 1024, p(1-p)=0.09000, sim=0.08949, delta=0.6%
Line 280 ⟶ 351:
t=500, p=0.90, n= 4096, p(1-p)=0.09000, sim=0.09047, delta=0.5%
t=500, p=0.90, n=16384, p(1-p)=0.09000, sim=0.09007, delta=0.1%</pre>
 
=={{header|EasyLang}}==
<syntaxhighlight lang="easylang">
numfmt 3 6
for p in [ 0.1 0.3 0.5 0.7 0.9 ]
theory = p * (1 - p)
print "p:" & p & " theory:" & theory
print " n sim"
for n in [ 1e2 1e3 1e4 ]
sum = 0
for t to 100
run = 0
for j to n
h = if randomf < p
if h = 1 and run = 0
sum += 1
.
run = h
.
.
print n & " " & sum / n / t
.
print ""
.
</syntaxhighlight>
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="scheme">
;; count 1-runs - The vector is not stored
(define (runs p n)
Line 305 ⟶ 401:
(for ([n '(10 100 1000)])
(printf "\t-- n %5d → %d" n (truns p n)))))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 332 ⟶ 428:
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: formatting fry io kernel math math.ranges math.statistics
random sequences ;
IN: rosetta-code.mean-run-density
Line 363 ⟶ 459:
: main ( -- ) header .1 .9 .2 <range> [ test ] each ;
 
MAIN: main</langsyntaxhighlight>
{{out}}
<pre>
Line 390 ⟶ 486:
 
=={{header|Fortran}}==
<langsyntaxhighlight lang="fortran">
! loosely translated from python. We do not need to generate and store the entire vector at once.
! compilation: gfortran -Wall -std=f2008 -o thisfile thisfile.f08
Line 450 ⟶ 546:
 
end program percolation_mean_run_density
</syntaxhighlight>
</lang>
 
<pre>
Line 479 ⟶ 575:
=={{header|FreeBASIC}}==
{{trans|Phix}}
<langsyntaxhighlight lang="freebasic">Function run_test(p As Double, longitud As Integer, runs As Integer) As Double
Dim As Integer r, l, cont = 0
Dim As Integer v, pv
Line 513 ⟶ 609:
Print
Next ip
Sleep</langsyntaxhighlight>
<pre>Same as Phix, C, Kotlin, Wren, Pascal or zkl entry.</pre>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 551 ⟶ 647:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 591 ⟶ 687:
 
=={{header|Haskell}}==
<langsyntaxhighlight Haskelllang="haskell">import Control.Monad.Random
import Control.Applicative
import Text.Printf
Line 619 ⟶ 715:
x <- newStdGen
forM_ [0.1,0.3,0.5,0.7,0.9] $ printKs x
</syntaxhighlight>
</lang>
<pre>./percolation
p= 0.1, K(p)= 0.090
Line 657 ⟶ 753:
The following works in both languages:
 
<langsyntaxhighlight lang="unicon">procedure main(A)
t := integer(A[2]) | 500
 
Line 671 ⟶ 767:
write(left(p,8)," ",left(n,8)," ",left(p*(1-p),10)," ",left(Ka/t, 10))
}
end</langsyntaxhighlight>
 
Output:
Line 697 ⟶ 793:
 
=={{header|J}}==
<syntaxhighlight lang="j">
<lang J>
NB. translation of python
Line 719 ⟶ 815:
EMPTY
)
</syntaxhighlight>
</lang>
Session:
<pre>
Line 744 ⟶ 840:
500 0.90 4096 0.090 0.090 0.1
500 0.90 16384 0.090 0.090 0.1
</pre>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
 
import java.util.concurrent.ThreadLocalRandom;
 
public final class PercolationMeanRun {
 
public static void main(String[] aArgs) {
System.out.println("Running 1000 tests each:" + System.lineSeparator());
System.out.println(" p\tlength\tresult\ttheory\t difference");
System.out.println("-".repeat(48));
for ( double probability = 0.1; probability <= 0.9; probability += 0.2 ) {
double theory = probability * ( 1.0 - probability );
int length = 100;
while ( length <= 100_000 ) {
double result = runTest(probability, length, 1_000);
System.out.println(String.format("%.1f\t%6d\t%.4f\t%.4f\t%+.4f (%+.2f%%)",
probability, length, result, theory, result - theory, ( result - theory ) / theory * 100));
length *= 10;
}
System.out.println();
}
 
}
private static double runTest(double aProbability, int aLength, int aRunCount) {
double count = 0.0;
for ( int run = 0; run < aRunCount; run++ ) {
int previousBit = 0;
int length = aLength;
while ( length-- > 0 ) {
int nextBit = ( random.nextDouble(1.0) < aProbability ) ? 1 : 0;
if ( previousBit < nextBit ) {
count += 1.0;
}
previousBit = nextBit;
}
}
return count / aRunCount / aLength;
}
 
private static ThreadLocalRandom random = ThreadLocalRandom.current();
 
}
</syntaxhighlight>
{{ out }}
<pre>
Running 1000 tests each:
 
p length result theory difference
------------------------------------------------
0.1 100 0.0899 0.0900 -0.0001 (-0.07%)
0.1 1000 0.0902 0.0900 +0.0002 (+0.18%)
0.1 10000 0.0900 0.0900 +0.0000 (+0.02%)
0.1 100000 0.0900 0.0900 -0.0000 (-0.00%)
 
0.3 100 0.2110 0.2100 +0.0010 (+0.47%)
0.3 1000 0.2101 0.2100 +0.0001 (+0.05%)
0.3 10000 0.2100 0.2100 -0.0000 (-0.01%)
0.3 100000 0.2100 0.2100 -0.0000 (-0.01%)
 
0.5 100 0.2516 0.2500 +0.0015 (+0.62%)
0.5 1000 0.2509 0.2500 +0.0009 (+0.37%)
0.5 10000 0.2499 0.2500 -0.0001 (-0.04%)
0.5 100000 0.2500 0.2500 +0.0000 (+0.00%)
 
0.7 100 0.2145 0.2100 +0.0045 (+2.12%)
0.7 1000 0.2106 0.2100 +0.0006 (+0.28%)
0.7 10000 0.2101 0.2100 +0.0001 (+0.06%)
0.7 100000 0.2100 0.2100 -0.0000 (-0.00%)
 
0.9 100 0.0970 0.0900 +0.0070 (+7.74%)
0.9 1000 0.0910 0.0900 +0.0010 (+1.15%)
0.9 10000 0.0901 0.0900 +0.0001 (+0.06%)
0.9 100000 0.0900 0.0900 +0.0000 (+0.00%)
</pre>
 
=={{header|Julia}}==
{{trans|Python}}
<langsyntaxhighlight lang="julia">using Printf, Distributions, IterTools
 
newv(n::Int, p::Float64) = rand(Bernoulli(p), n)
Line 767 ⟶ 941:
nrep, p, n, lim, sim, lim > 0 ? abs(sim - lim) / lim * 100 : sim * 100)
end
end</langsyntaxhighlight>
 
{{out}}
Line 808 ⟶ 982:
=={{header|Kotlin}}==
{{trans|C}}
<langsyntaxhighlight lang="scala">// version 1.2.10
 
import java.util.Random
Line 847 ⟶ 1,021:
println()
}
}</langsyntaxhighlight>
 
Sample output:
Line 881 ⟶ 1,055:
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">meanRunDensity[p_, len_, trials_] :=
Mean[Length[Cases[Split@#, {1, ___}]] & /@
Unitize[Chop[RandomReal[1, {trials, len}], 1 - p]]]/len
Line 889 ⟶ 1,063:
Table[{q, n, x = meanRunDensity[q, n, 100] // N,
q (1 - q) - x}, {n, {100, 1000, 10000, 100000}}], {}],
Alignment -> Left], {q, {.1, .3, .5, .7, .9}}]</langsyntaxhighlight>
{{out}}
<pre>
Line 925 ⟶ 1,099:
=={{header|Nim}}==
{{trans|Go}}
<langsyntaxhighlight Nimlang="nim">import random, strformat
 
const T = 100
Line 949 ⟶ 1,123:
 
let k = sum / (T * n)
echo &"{n:9} {k:15.4f} {k - theory:10.6f}"</langsyntaxhighlight>
 
{{out}}
Line 989 ⟶ 1,163:
=={{header|Pascal}}==
{{trans|C}}{{works with|Free Pascal}}
<langsyntaxhighlight lang="pascal">
{$MODE objFPC}//for using result,parameter runs becomes for variable..
uses
Line 1,041 ⟶ 1,215:
ip := ip+2;
end;
end.</langsyntaxhighlight>
Output
<pre>running 1000 tests each:
Line 1,074 ⟶ 1,248:
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="perl">sub R {
my ($n, $p) = @_;
my $r = join '',
Line 1,090 ⟶ 1,264:
printf " R(n, p)= %f\n", $r / t;
}
}</langsyntaxhighlight>
{{out}}
<pre>t= 100
Line 1,116 ⟶ 1,290:
=={{header|Phix}}==
{{trans|zkl}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">run_test</span><span style="color: #0000FF;">(</span><span style="color: #004080;">atom</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">len</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">runs</span><span style="color: #0000FF;">)</span>
Line 1,149 ⟶ 1,323:
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,182 ⟶ 1,356:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">from __future__ import division
from random import random
from math import fsum
Line 1,205 ⟶ 1,379:
sim = fsum(mean_run_density(n, p) for i in range(t)) / t
print('t=%3i p=%4.2f n=%5i p(1-p)=%5.3f sim=%5.3f delta=%3.1f%%'
% (t, p, n, limit, sim, abs(sim - limit) / limit * 100 if limit else sim * 100))</langsyntaxhighlight>
 
{{out}}
Line 1,230 ⟶ 1,404:
=={{header|Racket}}==
 
<langsyntaxhighlight lang="racket">#lang racket
(require racket/fixnum)
(define t (make-parameter 100))
Line 1,261 ⟶ 1,435:
(module+ test
(require rackunit)
(check-eq? (Rn (fxvector 1 1 0 0 0 1 0 1 1 1)) 3))</langsyntaxhighlight>
{{out}}
<pre>
Line 1,298 ⟶ 1,472:
=={{header|REXX}}==
{{trans|Fortran}}
<langsyntaxhighlight lang="rexx">/* REXX */
Numeric Digits 20
Call random(,12345) /* make the run reproducable */
Line 1,326 ⟶ 1,500:
Say format(n,10)' ' format(sim,2,4)' 'format(sim-theory,2,6)
End
End</langsyntaxhighlight>
{{out}}
<pre>p: 0.1000 theory: 0.0900 t: 100
Line 1,365 ⟶ 1,539:
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" perl6line>sub R($n, $p) { [+] ((rand < $p) xx $n).squish }
 
say 't= ', constant t = 100;
Line 1,374 ⟶ 1,548:
printf " R(%6d, p)= %f\n", $n, t R/ [+] R($n, $p)/$n xx t
}
}</langsyntaxhighlight>
{{out}}
<pre>t= 100
Line 1,400 ⟶ 1,574:
=={{header|Sidef}}==
{{trans|Raku}}
<langsyntaxhighlight lang="ruby">func R(n,p) {
n.of { 1.rand < p ? 1 : 0}.sum;
}
Line 1,412 ⟶ 1,586:
printf (" R(n, p)= %f\n", t.of { R(n, p) }.sum/n / t);
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,440 ⟶ 1,614:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc randomString {length probability} {
for {set s ""} {[string length $s] < $length} {} {
append s [expr {rand() < $probability}]
Line 1,472 ⟶ 1,646:
}
puts ""
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,499 ⟶ 1,673:
{{trans|Kotlin}}
{{libheader|Wren-fmt}}
<langsyntaxhighlight ecmascriptlang="wren">import "random" for Random
import "./fmt" for Fmt
 
var rand = Random.new()
Line 1,536 ⟶ 1,710:
}
System.print()
}</langsyntaxhighlight>
 
{{out}}
Line 1,572 ⟶ 1,746:
=={{header|zkl}}==
{{trans|C}}
<langsyntaxhighlight lang="zkl">fcn run_test(p,len,runs){
cnt:=0; do(runs){
pv:=0; do(len){
Line 1,581 ⟶ 1,755:
}
return(cnt.toFloat() / runs / len);
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">println("Running 1000 tests each:\n"
" p\t n\tK\tp(1-p)\t diff\n"
"-----------------------------------------------");
Line 1,594 ⟶ 1,768:
}
println();
}</langsyntaxhighlight>
{{out}}
<pre>
9,476

edits