Seven-sided dice from five-sided dice: Difference between revisions
Content added Content deleted
m (→{{header|Verilog}}: Fixed typo (teh → the)) |
Thundergnat (talk | contribs) (Rename Perl 6 -> Raku, alphabetize, minor clean-up) |
||
Line 304: | Line 304: | ||
flat |
flat |
||
</pre> |
</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++}}== |
=={{header|C++}}== |
||
Line 355: | Line 385: | ||
test_distribution(d5, 1000000, 0.001); |
test_distribution(d5, 1000000, 0.001); |
||
test_distribution(d7, 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> |
}</lang> |
||
Line 1,244: | Line 1,244: | ||
return x%7 + 1 |
return x%7 + 1 |
||
end</lang> |
end</lang> |
||
=={{header|M2000 Interpreter}}== |
=={{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. |
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: | Line 1,345: | ||
(t+2)\3 |
(t+2)\3 |
||
};</lang> |
};</lang> |
||
=={{header|Perl}}== |
=={{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. |
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: | Line 1,371: | ||
6: -0.15% |
6: -0.15% |
||
7: 0.24% |
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> |
</pre> |
||
Line 1,468: | Line 1,436: | ||
{1: 142853, 2: 142576, 3: 143067, 4: 142149, 5: 143189, 6: 143285, 7: 142881} |
{1: 142853, 2: 142576, 3: 143067, 4: 142149, 5: 143189, 6: 143285, 7: 142881} |
||
</pre> |
</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}}== |
=={{header|R}}== |
||
Line 1,527: | Line 1,471: | ||
} |
} |
||
system.time(dice7.vec(1e6)) # ~1 sec</lang> |
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}}== |
=={{header|REXX}}== |
||
Line 1,735: | Line 1,738: | ||
}</lang> |
}</lang> |
||
=={{header|Sidef}}== |
=={{header|Sidef}}== |
||
{{trans|Perl}} |
{{trans|Perl}} |
||
Line 1,829: | Line 1,833: | ||
[1] "Uniform? True" |
[1] "Uniform? True" |
||
</pre> |
</pre> |
||
=={{header|VBScript}}== |
=={{header|VBScript}}== |
||
<lang vb>Option Explicit |
<lang vb>Option Explicit |