Percolation/Mean run density: Difference between revisions

Add Factor example
m (move REXX :-()
(Add Factor example)
Line 275:
-- n 100 → 0.0894
-- n 1000 → 0.0905
</pre>
 
=={{header|Factor}}==
<lang factor>USING: formatting fry io kernel math math.ranges math.statistics
random sequences ;
IN: rosetta-code.mean-run-density
 
: rising? ( ? ? -- ? ) [ f = ] [ t = ] bi* and ;
 
: count-run ( n ? ? -- m ? )
2dup rising? [ [ 1 + ] 2dip ] when nip ;
 
: runs ( n p -- n )
[ 0 f ] 2dip '[ random-unit _ < count-run ] times drop ;
 
: rn ( n p -- x ) over [ runs ] dip /f ;
 
: sim ( n p -- avg )
[ 1000 ] 2dip [ rn ] 2curry replicate mean ;
 
: theory ( p -- x ) 1 over - * ;
 
: result ( n p -- )
[ swap ] [ sim ] [ nip theory ] 2tri 2dup - abs
"%.1f %-5d %.4f %.4f %.4f\n" printf ;
 
: test ( p -- )
{ 100 1,000 10,000 } [ swap result ] with each nl ;
 
: header ( -- )
"1000 tests each:\np n K p(1-p) diff" print ;
 
: main ( -- ) header .1 .9 .2 <range> [ test ] each ;
 
MAIN: main</lang>
{{out}}
<pre>
1000 tests each:
p n K p(1-p) diff
0.1 100 0.0909 0.0900 0.0009
0.1 1000 0.0902 0.0900 0.0002
0.1 10000 0.0899 0.0900 0.0001
 
0.3 100 0.2111 0.2100 0.0011
0.3 1000 0.2101 0.2100 0.0001
0.3 10000 0.2100 0.2100 0.0000
 
0.5 100 0.2524 0.2500 0.0024
0.5 1000 0.2504 0.2500 0.0004
0.5 10000 0.2501 0.2500 0.0001
 
0.7 100 0.2149 0.2100 0.0049
0.7 1000 0.2106 0.2100 0.0006
0.7 10000 0.2100 0.2100 0.0000
 
0.9 100 0.0978 0.0900 0.0078
0.9 1000 0.0905 0.0900 0.0005
0.9 10000 0.0901 0.0900 0.0001
</pre>
 
1,808

edits