Seven-sided dice from five-sided dice: Difference between revisions

Rename Perl 6 -> Raku, alphabetize, minor clean-up
m (→‎{{header|Verilog}}: Fixed typo (teh → the))
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 304:
flat
</pre>
 
=={{header|C sharp}}==
{{trans|Java}}
<lang csharp>
using System;
 
public class SevenSidedDice
{
Random random = new Random();
static void Main(string[] args)
{
SevenSidedDice sevenDice = new SevenSidedDice();
Console.WriteLine("Random number from 1 to 7: "+ sevenDice.seven());
Console.Read();
}
int seven()
{
int v=21;
while(v>20)
v=five()+five()*5-6;
return 1+v%7;
}
int five()
{
return 1 + random.Next(5);
}
}</lang>
 
=={{header|C++}}==
Line 355 ⟶ 385:
test_distribution(d5, 1000000, 0.001);
test_distribution(d7, 1000000, 0.001);
}</lang>
 
=={{header|C sharp}}==
{{trans|Java}}
<lang csharp>
using System;
 
public class SevenSidedDice
{
Random random = new Random();
static void Main(string[] args)
{
SevenSidedDice sevenDice = new SevenSidedDice();
Console.WriteLine("Random number from 1 to 7: "+ sevenDice.seven());
Console.Read();
}
int seven()
{
int v=21;
while(v>20)
v=five()+five()*5-6;
return 1+v%7;
}
int five()
{
return 1 + random.Next(5);
}
}</lang>
 
Line 1,244:
return x%7 + 1
end</lang>
 
=={{header|M2000 Interpreter}}==
We make a stack object (is reference type) and pass it as a closure to dice7 lambda function. For each dice7 we pop the top value of stack, and we add a fresh dice5 (random(1,5)) as last value of stack, so stack used as FIFO. Each time z has the sum of 7 random values.
Line 1,344 ⟶ 1,345:
(t+2)\3
};</lang>
 
=={{header|Perl}}==
Using dice5 twice to generate numbers in the range 0 to 24. If we consider these modulo 8 and re-call if we get zero, we have eliminated 4 cases and created the necessary number in the range from 1 to 7.
Line 1,369 ⟶ 1,371:
6: -0.15%
7: 0.24%
</pre>
 
=={{header|Perl 6}}==
{{works with|Rakudo|2018.03}}
 
<lang perl6>my $d5 = 1..5;
sub d5() { $d5.roll; } # 1d5
 
sub d7() {
my $flat = 21;
$flat = 5 * d5() - d5() until $flat < 21;
$flat % 7 + 1;
}
 
# Testing
my @dist;
my $n = 1_000_000;
my $expect = $n / 7;
 
loop ($_ = $n; $n; --$n) { @dist[d7()]++; }
 
say "Expect\t",$expect.fmt("%.3f");
for @dist.kv -> $i, $v {
say "$i\t$v\t" ~ (($v - $expect)/$expect*100).fmt("%+.2f%%") if $v;
}</lang>
{{out}}
<pre>Expect 142857.143
1 143088 +0.16%
2 143598 +0.52%
3 141741 -0.78%
4 142832 -0.02%
5 143040 +0.13%
6 142988 +0.09%
7 142713 -0.10%
</pre>
 
Line 1,468 ⟶ 1,436:
{1: 142853, 2: 142576, 3: 143067, 4: 142149, 5: 143189, 6: 143285, 7: 142881}
</pre>
 
=={{header|Racket}}==
<lang Racket>
#lang racket
(define (dice5) (add1 (random 5)))
 
(define (dice7)
(define res (+ (* 5 (dice5)) (dice5) -6))
(if (< res 21) (+ 1 (modulo res 7)) (dice7)))
</lang>
 
Checking the uniformity using math library:
 
<lang racket>
-> (require math/statistics)
-> (samples->hash (for/list ([i 700000]) (dice7)))
'#hash((7 . 100392)
(6 . 100285)
(5 . 99774)
(4 . 100000)
(3 . 100000)
(2 . 99927)
(1 . 99622))
</lang>
 
=={{header|R}}==
Line 1,527 ⟶ 1,471:
}
system.time(dice7.vec(1e6)) # ~1 sec</lang>
 
=={{header|Racket}}==
<lang Racket>
#lang racket
(define (dice5) (add1 (random 5)))
 
(define (dice7)
(define res (+ (* 5 (dice5)) (dice5) -6))
(if (< res 21) (+ 1 (modulo res 7)) (dice7)))
</lang>
 
Checking the uniformity using math library:
 
<lang racket>
-> (require math/statistics)
-> (samples->hash (for/list ([i 700000]) (dice7)))
'#hash((7 . 100392)
(6 . 100285)
(5 . 99774)
(4 . 100000)
(3 . 100000)
(2 . 99927)
(1 . 99622))
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.03}}
 
<lang perl6>my $d5 = 1..5;
sub d5() { $d5.roll; } # 1d5
 
sub d7() {
my $flat = 21;
$flat = 5 * d5() - d5() until $flat < 21;
$flat % 7 + 1;
}
 
# Testing
my @dist;
my $n = 1_000_000;
my $expect = $n / 7;
 
loop ($_ = $n; $n; --$n) { @dist[d7()]++; }
 
say "Expect\t",$expect.fmt("%.3f");
for @dist.kv -> $i, $v {
say "$i\t$v\t" ~ (($v - $expect)/$expect*100).fmt("%+.2f%%") if $v;
}</lang>
{{out}}
<pre>Expect 142857.143
1 143088 +0.16%
2 143598 +0.52%
3 141741 -0.78%
4 142832 -0.02%
5 143040 +0.13%
6 142988 +0.09%
7 142713 -0.10%
</pre>
 
=={{header|REXX}}==
Line 1,735 ⟶ 1,738:
 
}</lang>
 
=={{header|Sidef}}==
{{trans|Perl}}
Line 1,829 ⟶ 1,833:
[1] "Uniform? True"
</pre>
 
=={{header|VBScript}}==
<lang vb>Option Explicit
10,327

edits