Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.85 KB | None | 0 0
  1. my $min = 1; # Min die value.
  2. my $max = 6; # Max die value
  3. my $numdice = 4;
  4.  
  5. my $dice; # ref to the table with dice.
  6. my $num; # number of combinations.
  7. my $hist; # histogram
  8.  
  9. sub High_one;
  10.  
  11. prepare_dice();
  12. # print "@{$dice}" . "\n";
  13. # for (my $i=1; $i<216; $i++)
  14. # { forward_dice();
  15. # }
  16. do
  17. {
  18. # print "@{$dice}" . "\n";
  19. $$hist{High_two()} += 1;
  20. } while (forward_dice());
  21. # print "@{$dice} Num: $num\n";
  22. print_hist();
  23.  
  24.  
  25. # Init $dice to $numdice dice with value $min.
  26. sub prepare_dice
  27. { $dice = undef;
  28. $num = 1;
  29. for (my $i=0; $i<$numdice; $i++)
  30. { push (@{$dice}, $min);
  31. }
  32. }
  33.  
  34. # Forwards dice by 1 and takes care of overflows.
  35. # Returns 0 when there are no more combinations, 1 otherwise.
  36. sub forward_dice
  37. { my $ind = $numdice -1;
  38. my $ovf = 0; # Overflow
  39. do
  40. { $ovf = 0;
  41. $$dice[$ind] += 1;
  42. if ($$dice[$ind] > $max)
  43. { $$dice[$ind] = $min;
  44. $ind--;
  45. $ovf = 1;
  46. }
  47. } while ($ovf and ($ind >= 0));
  48. if ($ind >= 0)
  49. { $num++;
  50. return 1;
  51. }
  52. return 0;
  53. }
  54.  
  55. # Return the highest die.
  56. sub High_one
  57. { my @sorted = sort { $b <=> $a} @$dice;
  58. return $sorted[0];
  59. }
  60.  
  61. # Return the sum of two highest dice.
  62. sub High_two
  63. { my @sorted = sort { $b <=> $a} @$dice;
  64. return $sorted[0] + $sorted[1];
  65. }
  66.  
  67.  
  68. # Print histohram.
  69. sub print_hist
  70. { my %upto = (); # Number of this or lower.
  71. foreach my $i (sort { $a <=> $b} keys %$hist)
  72. { $upto[$i] = $$hist{$i};
  73. $upto[$i] += $upto[$i-1] if (defined $upto[$i-1]);
  74. }
  75. my %gteq = (); # Number of this or higher
  76. foreach my $i (sort { $b <=> $a} keys %$hist)
  77. { $gteq[$i] = $$hist{$i};
  78. $gteq[$i] += $gteq[$i+1] if (defined $gteq[$i+1]);
  79. }
  80.  
  81. my $avg = 0; # Compute average and standard deviation.
  82. my $stdev = 0;
  83. foreach my $i (keys %$hist)
  84. { $avg += $i * $$hist{$i};
  85. }
  86. $avg /= $num;
  87. $avg = sprintf '%2.4f', $avg;
  88. foreach my $i (keys %$hist)
  89. { $stdev += ($avg - $i) * ($avg - $i);
  90. }
  91. $stdev /= keys (%$hist);
  92. $stdev = sprintf '%2.4f', sqrt($stdev);
  93.  
  94. print "Dice: Highest 2 of $numdice, combinations: $num, Average: $avg, Stdev: $stdev \n";
  95. print "Outcome, Probability, LowerOrEqual, HigherOrEqual \n";
  96. foreach my $i (sort { $a <=> $b} keys %$hist)
  97. { my $ind = sprintf "%2d", $i;
  98. my $prob = sprintf '%.6f', $$hist{$i}/$num;
  99. my $lowEq = sprintf '%.6f', $upto[$i]/$num;
  100. my $gtEq = sprintf '%.6f', $gteq[$i]/$num;
  101. print "$ind, $prob, $lowEq, $gtEq \n";
  102. }
  103. #print "@{$hist} \n";
  104. }
  105.  
  106.  
  107.  
  108. # Sortowanie takie jak potrzebuję, z zachowaniem tablicy źródłowej i od największej liczby do najmniejszej:
  109. # my @sorted = sort { $b <=> $a} @$aref;
  110. # Wystarczy wtedy wziąść pewną część liczb od początku.
  111. # Ewentualnie obciąć:
  112. # my @third = splice(@sorted, 0, 2); // Pierwsze 2.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement