Probabilistic choice: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
|||
Line 363: | Line 363: | ||
zayin 91001 9.1001% 9.0909% |
zayin 91001 9.1001% 9.0909% |
||
heth 63330 6.3330% 6.3456%</lang> |
heth 63330 6.3330% 6.3456%</lang> |
||
=={{header|C++}}== |
|||
<lang cpp>#include <cstdlib> |
|||
#include <iostream> |
|||
#include <vector> |
|||
#include <utility> |
|||
#include <algorithm> |
|||
#include <ctime> |
|||
#include <iomanip> |
|||
int main( ) { |
|||
typedef std::vector<std::pair<std::string, double> >::const_iterator SPI ; |
|||
typedef std::vector<std::pair<std::string , double> > ProbType ; |
|||
ProbType probabilities ; |
|||
probabilities.push_back( std::make_pair( "aleph" , 1/5.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "beth" , 1/6.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "gimel" , 1/7.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "daleth" , 1/8.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "he" , 1/9.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "waw" , 1/10.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "zayin" , 1/11.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "heth" , 1759/27720.0 ) ) ; |
|||
std::vector<std::string> generated ; //for the strings that are generatod |
|||
std::vector<int> decider ; //holds the numbers that determine the choice of letters |
|||
for ( int i = 0 ; i < probabilities.size( ) ; i++ ) { |
|||
if ( i == 0 ) { |
|||
decider.push_back( 27720 * (probabilities[ i ].second) ) ; |
|||
} |
|||
else { |
|||
int number = 0 ; |
|||
for ( int j = 0 ; j < i ; j++ ) { |
|||
number += 27720 * ( probabilities[ j ].second ) ; |
|||
} |
|||
number += 27720 * probabilities[ i ].second ; |
|||
decider.push_back( number ) ; |
|||
} |
|||
} |
|||
srand( time( 0 ) ) ; |
|||
for ( int i = 0 ; i < 1000000 ; i++ ) { |
|||
int randnumber = rand( ) % 27721 ; |
|||
int j = 0 ; |
|||
while ( randnumber > decider[ j ] ) |
|||
j++ ; |
|||
generated.push_back( ( probabilities[ j ]).first ) ; |
|||
} |
|||
std::cout << "letter frequency attained frequency expected\n" ; |
|||
for ( SPI i = probabilities.begin( ) ; i != probabilities.end( ) ; i++ ) { |
|||
std::cout << std::left << std::setw( 8 ) << i->first ; |
|||
int found = std::count ( generated.begin( ) , generated.end( ) , i->first ) ; |
|||
std::cout << std::left << std::setw( 21 ) << found / 1000000.0 ; |
|||
std::cout << std::left << std::setw( 17 ) << i->second << '\n' ; |
|||
} |
|||
return 0 ; |
|||
}</lang> |
|||
Output: |
|||
<PRE>letter frequency attained frequency expected |
|||
aleph 0.200089 0.2 |
|||
beth 0.16695 0.166667 |
|||
gimel 0.142693 0.142857 |
|||
daleth 0.124859 0.125 |
|||
he 0.111258 0.111111 |
|||
waw 0.099665 0.1 |
|||
zayin 0.090654 0.0909091 |
|||
heth 0.063832 0.063456 |
|||
</PRE> |
|||
=={{header|C sharp|C#}}== |
=={{header|C sharp|C#}}== |
||
Line 513: | Line 448: | ||
Target prob.: 0.200000 0.166667 0.142857 0.125000 0.111111 0.100000 0.090909 0.063456 |
Target prob.: 0.200000 0.166667 0.142857 0.125000 0.111111 0.100000 0.090909 0.063456 |
||
Attained prob.: 0.199975 0.166460 0.142290 0.125510 0.111374 0.100018 0.090746 0.063627</pre> |
Attained prob.: 0.199975 0.166460 0.142290 0.125510 0.111374 0.100018 0.090746 0.063627</pre> |
||
=={{header|C++}}== |
|||
<lang cpp>#include <cstdlib> |
|||
#include <iostream> |
|||
#include <vector> |
|||
#include <utility> |
|||
#include <algorithm> |
|||
#include <ctime> |
|||
#include <iomanip> |
|||
int main( ) { |
|||
typedef std::vector<std::pair<std::string, double> >::const_iterator SPI ; |
|||
typedef std::vector<std::pair<std::string , double> > ProbType ; |
|||
ProbType probabilities ; |
|||
probabilities.push_back( std::make_pair( "aleph" , 1/5.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "beth" , 1/6.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "gimel" , 1/7.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "daleth" , 1/8.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "he" , 1/9.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "waw" , 1/10.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "zayin" , 1/11.0 ) ) ; |
|||
probabilities.push_back( std::make_pair( "heth" , 1759/27720.0 ) ) ; |
|||
std::vector<std::string> generated ; //for the strings that are generatod |
|||
std::vector<int> decider ; //holds the numbers that determine the choice of letters |
|||
for ( int i = 0 ; i < probabilities.size( ) ; i++ ) { |
|||
if ( i == 0 ) { |
|||
decider.push_back( 27720 * (probabilities[ i ].second) ) ; |
|||
} |
|||
else { |
|||
int number = 0 ; |
|||
for ( int j = 0 ; j < i ; j++ ) { |
|||
number += 27720 * ( probabilities[ j ].second ) ; |
|||
} |
|||
number += 27720 * probabilities[ i ].second ; |
|||
decider.push_back( number ) ; |
|||
} |
|||
} |
|||
srand( time( 0 ) ) ; |
|||
for ( int i = 0 ; i < 1000000 ; i++ ) { |
|||
int randnumber = rand( ) % 27721 ; |
|||
int j = 0 ; |
|||
while ( randnumber > decider[ j ] ) |
|||
j++ ; |
|||
generated.push_back( ( probabilities[ j ]).first ) ; |
|||
} |
|||
std::cout << "letter frequency attained frequency expected\n" ; |
|||
for ( SPI i = probabilities.begin( ) ; i != probabilities.end( ) ; i++ ) { |
|||
std::cout << std::left << std::setw( 8 ) << i->first ; |
|||
int found = std::count ( generated.begin( ) , generated.end( ) , i->first ) ; |
|||
std::cout << std::left << std::setw( 21 ) << found / 1000000.0 ; |
|||
std::cout << std::left << std::setw( 17 ) << i->second << '\n' ; |
|||
} |
|||
return 0 ; |
|||
}</lang> |
|||
Output: |
|||
<PRE>letter frequency attained frequency expected |
|||
aleph 0.200089 0.2 |
|||
beth 0.16695 0.166667 |
|||
gimel 0.142693 0.142857 |
|||
daleth 0.124859 0.125 |
|||
he 0.111258 0.111111 |
|||
waw 0.099665 0.1 |
|||
zayin 0.090654 0.0909091 |
|||
heth 0.063832 0.063456 |
|||
</PRE> |
|||
=={{header|Clojure}}== |
=={{header|Clojure}}== |
||
Line 2,155: | Line 2,155: | ||
zayin 0.091014 0.090909 0.000105 |
zayin 0.091014 0.090909 0.000105 |
||
heth 0.063731 0.063456 0.000275</pre> |
heth 0.063731 0.063456 0.000275</pre> |
||
=={{header|Perl 6}}== |
|||
{{works with|Rakudo|2018.10}} |
|||
<lang perl6>constant TRIALS = 1e6; |
|||
constant @event = <aleph beth gimel daleth he waw zayin heth>; |
|||
constant @P = flat (1 X/ 5 .. 11), 1759/27720; |
|||
constant @cP = [\+] @P; |
|||
my atomicint @results[+@event]; |
|||
(^TRIALS).race.map: { @results[ @cP.first: { $_ > once rand }, :k ]⚛++; } |
|||
say 'Event Occurred Expected Difference'; |
|||
for ^@results { |
|||
my ($occurred, $expected) = @results[$_], @P[$_] * TRIALS; |
|||
printf "%-9s%8.0f%9.1f%12.1f\n", |
|||
@event[$_], |
|||
$occurred, |
|||
$expected, |
|||
abs $occurred - $expected; |
|||
}</lang> |
|||
{{out}} |
|||
<pre>Event Occurred Expected Difference |
|||
aleph 200369 200000.0 369.0 |
|||
beth 167005 166666.7 338.3 |
|||
gimel 142690 142857.1 167.1 |
|||
daleth 125061 125000.0 61.0 |
|||
he 110563 111111.1 548.1 |
|||
waw 100214 100000.0 214.0 |
|||
zayin 90617 90909.1 292.1 |
|||
heth 63481 63456.0 25.0</pre> |
|||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
Line 2,689: | Line 2,657: | ||
zayin 90478 1000000/11 45239/500000 -0.47% |
zayin 90478 1000000/11 45239/500000 -0.47% |
||
he 111275 1000000/9 4451/40000 0.15%</pre> |
he 111275 1000000/9 4451/40000 0.15%</pre> |
||
=={{header|Raku}}== |
|||
(formerly Perl 6) |
|||
{{works with|Rakudo|2018.10}} |
|||
<lang perl6>constant TRIALS = 1e6; |
|||
constant @event = <aleph beth gimel daleth he waw zayin heth>; |
|||
constant @P = flat (1 X/ 5 .. 11), 1759/27720; |
|||
constant @cP = [\+] @P; |
|||
my atomicint @results[+@event]; |
|||
(^TRIALS).race.map: { @results[ @cP.first: { $_ > once rand }, :k ]⚛++; } |
|||
say 'Event Occurred Expected Difference'; |
|||
for ^@results { |
|||
my ($occurred, $expected) = @results[$_], @P[$_] * TRIALS; |
|||
printf "%-9s%8.0f%9.1f%12.1f\n", |
|||
@event[$_], |
|||
$occurred, |
|||
$expected, |
|||
abs $occurred - $expected; |
|||
}</lang> |
|||
{{out}} |
|||
<pre>Event Occurred Expected Difference |
|||
aleph 200369 200000.0 369.0 |
|||
beth 167005 166666.7 338.3 |
|||
gimel 142690 142857.1 167.1 |
|||
daleth 125061 125000.0 61.0 |
|||
he 110563 111111.1 548.1 |
|||
waw 100214 100000.0 214.0 |
|||
zayin 90617 90909.1 292.1 |
|||
heth 63481 63456.0 25.0</pre> |
|||
=={{header|REXX}}== |
=={{header|REXX}}== |
||
Line 3,071: | Line 3,072: | ||
'heth 0.0630 0.0632 ok |
'heth 0.0630 0.0632 ok |
||
1.0000 1.0000</pre> |
1.0000 1.0000</pre> |
||
=={{header|Seed7}}== |
|||
To reduce the runtime this program should be compiled. |
|||
<lang seed7>$ include "seed7_05.s7i"; |
|||
include "float.s7i"; |
|||
const type: letter is new enum |
|||
aleph, beth, gimel, daleth, he, waw, zayin, heth |
|||
end enum; |
|||
const func string: str (in letter: aLetter) is |
|||
return [] ("aleph", "beth", "gimel", "daleth", "he", "waw", "zayin", "heth") [succ(ord(aLetter))]; |
|||
enable_output(letter); |
|||
const array [letter] integer: table is [letter] ( |
|||
5544, 4620, 3960, 3465, 3080, 2772, 2520, 1759); |
|||
const func letter: randomLetter is func |
|||
result |
|||
var letter: resultLetter is aleph; |
|||
local |
|||
var integer: number is 0; |
|||
begin |
|||
number := rand(1, 27720); |
|||
while number > table[resultLetter] do |
|||
number -:= table[resultLetter]; |
|||
incr(resultLetter); |
|||
end while; |
|||
end func; |
|||
const proc: main is func |
|||
local |
|||
var integer: count is 0; |
|||
var letter: aLetter is aleph; |
|||
var array [letter] integer: occurrence is letter times 0; |
|||
begin |
|||
for count range 1 to 1000000 do |
|||
aLetter := randomLetter; |
|||
incr(occurrence[aLetter]); |
|||
end for; |
|||
writeln("Name Count Ratio Expected"); |
|||
for aLetter range letter.first to letter.last do |
|||
writeln(aLetter rpad 7 <& occurrence[aLetter] lpad 6 <& |
|||
flt(occurrence[aLetter]) / 10000.9 digits 4 lpad 8 <& "%" <& |
|||
100.0 * flt(table[aLetter]) / 27720.0 digits 4 lpad 8 <& "%"); |
|||
end for; |
|||
end func;</lang> |
|||
Outout: |
|||
<pre> |
|||
Name Count Ratio Expected |
|||
aleph 199788 19.9770% 20.0000% |
|||
beth 166897 16.6882% 16.6667% |
|||
gimel 143103 14.3090% 14.2857% |
|||
daleth 125060 12.5049% 12.5000% |
|||
he 110848 11.0838% 11.1111% |
|||
waw 99550 9.9541% 10.0000% |
|||
zayin 90918 9.0910% 9.0909% |
|||
heth 63836 6.3830% 6.3456% |
|||
</pre> |
|||
=={{header|Scheme}}== |
=={{header|Scheme}}== |
||
Line 3,193: | Line 3,133: | ||
zayin 0.09091 0.09096 |
zayin 0.09091 0.09096 |
||
heth 0.06346 0.06313 |
heth 0.06346 0.06313 |
||
=={{header|Seed7}}== |
|||
To reduce the runtime this program should be compiled. |
|||
<lang seed7>$ include "seed7_05.s7i"; |
|||
include "float.s7i"; |
|||
const type: letter is new enum |
|||
aleph, beth, gimel, daleth, he, waw, zayin, heth |
|||
end enum; |
|||
const func string: str (in letter: aLetter) is |
|||
return [] ("aleph", "beth", "gimel", "daleth", "he", "waw", "zayin", "heth") [succ(ord(aLetter))]; |
|||
enable_output(letter); |
|||
const array [letter] integer: table is [letter] ( |
|||
5544, 4620, 3960, 3465, 3080, 2772, 2520, 1759); |
|||
const func letter: randomLetter is func |
|||
result |
|||
var letter: resultLetter is aleph; |
|||
local |
|||
var integer: number is 0; |
|||
begin |
|||
number := rand(1, 27720); |
|||
while number > table[resultLetter] do |
|||
number -:= table[resultLetter]; |
|||
incr(resultLetter); |
|||
end while; |
|||
end func; |
|||
const proc: main is func |
|||
local |
|||
var integer: count is 0; |
|||
var letter: aLetter is aleph; |
|||
var array [letter] integer: occurrence is letter times 0; |
|||
begin |
|||
for count range 1 to 1000000 do |
|||
aLetter := randomLetter; |
|||
incr(occurrence[aLetter]); |
|||
end for; |
|||
writeln("Name Count Ratio Expected"); |
|||
for aLetter range letter.first to letter.last do |
|||
writeln(aLetter rpad 7 <& occurrence[aLetter] lpad 6 <& |
|||
flt(occurrence[aLetter]) / 10000.9 digits 4 lpad 8 <& "%" <& |
|||
100.0 * flt(table[aLetter]) / 27720.0 digits 4 lpad 8 <& "%"); |
|||
end for; |
|||
end func;</lang> |
|||
Outout: |
|||
<pre> |
|||
Name Count Ratio Expected |
|||
aleph 199788 19.9770% 20.0000% |
|||
beth 166897 16.6882% 16.6667% |
|||
gimel 143103 14.3090% 14.2857% |
|||
daleth 125060 12.5049% 12.5000% |
|||
he 110848 11.0838% 11.1111% |
|||
waw 99550 9.9541% 10.0000% |
|||
zayin 90918 9.0910% 9.0909% |
|||
heth 63836 6.3830% 6.3456% |
|||
</pre> |
|||
=={{header|Sidef}}== |
=={{header|Sidef}}== |