# Algorithm for probability when looping

By: nezzario on Jan 17th, 2013  |  syntax: PHP  |  size: 1.62 KB  |  views: 51  |  expires: Never
This paste has a previous version, view the difference. Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
1. <?php
2.   // Based on code from:
3.   // http://stackoverflow.com/questions/14389180/algorithm-for-probability-when-looping-over-a-randomly-ordered-array
4.   // http://math.stackexchange.com/questions/280792/determining-probability-in-a-random-loop/280948#280948
5.   // -------------
6.
7.   // Taken from php.net/shuffle user notes
8.   function shuffle_assoc(\$array) {
9.     \$keys = array_keys(\$array);
10.     shuffle(\$keys);
11.     foreach(\$keys as \$key) {
12.       \$new[\$key] = \$array[\$key];
13.     }
14.     return \$new;
15.   }
16.
17.   \$i = 1000000; // How many tests to perform
18.
19.   // This is my rule list.  Each key is a simple color
20.   // and each value is a probability represented as a percent
21.   \$rules = array(
22.     'black' => 20,
23.     'white' => 10,
24.     'red' => 40,
25.     'green' => 5,
26.     'blue' => 25,
27.   );
28.
29.   // Initialize the scores array with all 0's
30.   // The "outs" will be used when the probability does not
31.   // occur in any of the rules
32.   \$scores = array('outs' => 0);
33.   foreach(\$rules as \$k => \$v) {
34.     \$scores[\$k] = 0;
35.   }
36.
37.   \$count = count(\$rules);
38.
39.   for(\$x = 0; \$x < \$i; \$x++) {
40.     \$rules = shuffle_assoc(\$rules);
41.
42.     \$accumulated_probability = 0;
43.     \$rand = mt_rand(1,100);
44.     foreach(\$rules as \$k => \$probability) {
45.       \$actual_probability = \$probability + \$accumulated_probability;
46.       \$accumulated_probability = \$probability + \$accumulated_probability;
47.
48.       if(\$rand > \$actual_probability) {
49.         continue;
50.       } else {
51.         \$scores[\$k]++;
52.         continue 2;
53.       }
54.     }
55.     \$scores['outs']++;
56.   }
57.
58.
59.   foreach(\$scores as \$k => \$v) {
60.     echo "\$k: " . ((\$v/\$i)*100) . "% (\$v/\$i)\n";
61.   }
62.
63. ?>
clone this paste RAW Paste Data
Top