Probabilistic choice: Difference between revisions

Rename Perl 6 -> Raku, alphabetize, minor clean-up
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 363:
zayin 91001 9.1001% 9.0909%
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#}}==
Line 513 ⟶ 448:
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>
 
=={{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}}==
Line 2,155:
zayin 0.091014 0.090909 0.000105
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}}==
Line 2,689 ⟶ 2,657:
zayin 90478 1000000/11 45239/500000 -0.47%
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}}==
Line 3,071 ⟶ 3,072:
'heth 0.0630 0.0632 ok
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}}==
Line 3,193 ⟶ 3,133:
zayin 0.09091 0.09096
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}}==
10,327

edits