Deze thread las ik en begon ik me af te vragen wat nou het verschil tussen rand() en mt_rand() is.
Daarom heb ik nu een vraagstuk over de twee random value generators in PHP. Het gaat dus om rand() en mt_rand(). In de PHP manual wordt gesteld dat mt_rand() beter en sneller is.
Maar waarom dan? Dus heb ik een scriptje geschreven dat twee record sets van 100000 records met elk 1 random value genereerd (met een minimum van 0 en maximum van 100). De ene door rand() en de ander door mt_rand().
Daar berekent de standaardafwijking van. Deze zet ik in resp. $_SESSION['rand'][] en $_SESSION['mt_rand'][]. Na dit 100 keer gedaan te hebben rekent PHP de gemiddelden en de standaardafwijkingen uit van de standaardafwijkingen uit de SESSIE.
Hij echo't na 100 gedraait te hebben de laatste bevindingen van de random generator datasets en de gegevens uit de SESSIE.
Het resultaat geeft minimale verschillen aan. Waarom is mt_rand() beter dan rand() (behalve dattie sneller is)? Of is mijn manier van onderzoeken verkeerd? Of hebben de kleine verschillen grote gevolgen?
Hieronder de code:
(mocht je dit script ook willen runnen: per opvraag doettie er op een P4 2,4 GHz, 512MB zo'n 8 seconde over. Met 100 keer runnen (wattie doet) ben je dan dus een klein kwartiertje bezig...)
/edit
Bij een timeout kan je gewoon refreshen en gaattie verder, vars staan in SESSIE.
Daarom heb ik nu een vraagstuk over de twee random value generators in PHP. Het gaat dus om rand() en mt_rand(). In de PHP manual wordt gesteld dat mt_rand() beter en sneller is.
Maar waarom dan? Dus heb ik een scriptje geschreven dat twee record sets van 100000 records met elk 1 random value genereerd (met een minimum van 0 en maximum van 100). De ene door rand() en de ander door mt_rand().
Daar berekent de standaardafwijking van. Deze zet ik in resp. $_SESSION['rand'][] en $_SESSION['mt_rand'][]. Na dit 100 keer gedaan te hebben rekent PHP de gemiddelden en de standaardafwijkingen uit van de standaardafwijkingen uit de SESSIE.
Hij echo't na 100 gedraait te hebben de laatste bevindingen van de random generator datasets en de gegevens uit de SESSIE.
Het resultaat geeft minimale verschillen aan. Waarom is mt_rand() beter dan rand() (behalve dattie sneller is)? Of is mijn manier van onderzoeken verkeerd? Of hebben de kleine verschillen grote gevolgen?
Hieronder de code:
(mocht je dit script ook willen runnen: per opvraag doettie er op een P4 2,4 GHz, 512MB zo'n 8 seconde over. Met 100 keer runnen (wattie doet) ben je dan dus een klein kwartiertje bezig...)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
| <?PHP class dataSet { var $data; function dataSet() { $this->data = array(); if(func_num_args() > 0) if(func_num_args() == 1) $this->add(func_get_arg(0)); else $this->add(func_get_args()); } function add() { $n = func_num_args(); if($n == 1) $nr = func_get_arg(0); else $nr = func_get_args(); if(!is_integer($nr) && !is_float($nr)) if(!is_array($nr)) return 0; else { for($i = 0; $i < count($nr); $i++) $this->add($nr[$i]); return; } $this->data[] = $nr; return 1; } function getMdn() { if($this->data == array()) return 0; $tmp = $this->data; sort($tmp, SORT_NUMERIC); $c = count($tmp); if($this->isEven($c)) return (($tmp[floor(count($tmp)/2)] + $tmp[ceil(count($tmp)/2)]) / 2); return $tmp[(count($tmp)/2)]; } function getMds() { if($this->data == array()) return 0; $mod_arr = array(); for($i = 0; $i < count($this->data); $i++) { if(!isset($mod_arr[$this->data[$i]])) $mod_arr[$this->data[$i]] = 0; $mod_arr[$this->data[$i]]++; } arsort($mod_arr, SORT_NUMERIC); $keys = array_keys($mod_arr); $n = $mod_arr[$keys[0]]; $modus = array(); for($i = 0; $i < count($mod_arr); $i++) if($mod_arr[$keys[$i]] == $n) $modus[] = $keys[$i]; else $i = count($mod_arr); return $this->getAvg($modus); } function getAvg($a = 0) { if($a == 0) $a = $this->data; $sum = 0; for($i = 0; $i < count($a); $i++) $sum += $a[$i]; return $sum/count($a); } function getStdDev() { $avg = $this->getAvg(); $d = array(); for($i = 0; $i < count($this->data); $i++) $d[] = pow(($avg - $this->data[$i]), 2); return sqrt($this->getAvg($d)); } function isEven($nr = "") { if($nr == "") return $this->isEven(counr($this->data)); return (($nr % 2) == 0)? 1: 0; } function getData() { return $this->data; } function printSumm() { echo "Records: ".count($this->data)."<BR />"; echo "Average: ".$this->getAvg()."<BR />"; echo "Modus: ".$this->getMds()."<BR />"; echo "Median: ".$this->getMdn()."<BR />"; echo "Std.Dev: ".$this->getStdDev()."<BR />"; echo "<BR />"; } } session_start(); $arr = array(); for($i = 0; $i < 100000; $i++) $arr[] = rand(0, 100); $ds = new dataSet($arr); echo "rand()<br>"; $_SESSION['rand'][] = $ds->getStdDev(); $ds->printSumm(); $arr = array(); for($i = 0; $i < 100000; $i++) $arr[] = mt_rand(0, 100); $ds = new dataSet($arr); echo "mt_rand()<br>"; $_SESSION['mt_rand'][] = $ds->getStdDev(); $ds->printSumm(); if(count($_SESSION['rand']) > 99) { $ds = new dataSet($_SESSION['rand']); echo "Rand stddev avg: ".$ds->getAvg()."<br>"; echo "Rand stddev stddev: ".$ds->getStdDev()."<br>"; echo "\n<br>"; $ds = new dataSet($_SESSION['mt_rand']); echo "Mt_rand stddev avg: ".$ds->getAvg()."<br>"; echo "Mt_rand stddev stddev: ".$ds->getStdDev()."<br>"; $_SESSION = array(); session_destroy(); } else { echo count($_SESSION['rand']); header("Location: ".$_SERVER['PHP_SELF']); } ?> |
/edit
Bij een timeout kan je gewoon refreshen en gaattie verder, vars staan in SESSIE.
[ Voor 9% gewijzigd door Jurgle op 17-10-2003 23:31 ]
My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant