rand值出现负数的解决方案

当rand($number)或者mt_rand($number)的时候,$number太大,超过pow(2,31) - 1;即整型最大值的时候,会出现负数。

如果只是单纯转换成整数而已的话,可以采用sprintf('%u', $number)来处理,如果是概率统计,过滤一定的范围的话,可以看看如下解决方案:

 1 public function my_mt_rand($randMaxValue) {
 2         $intMaxValue = pow(2,31) - 1;    //rand函数最大值
 3         $maxValueLen = strlen($randMaxValue);    //最大值的长度
 4         $intMaxValueLen = strlen($intMaxValue);    //rand函数最大值的长度
 5         
 6         /*if($randMaxValue>$intMaxValue){
 7             $randValue = mt_rand(0, $intMaxValue);
 8         }else{
 9             $randValue = mt_rand(0, $randMaxValue);
10         }
11         return $randValue;*/
12         
13         if ($randMaxValue > $intMaxValue) {
14             if ($maxValueLen == $intMaxValueLen) {
15                 //$randValue = mt_rand(0, $intMaxValue);
16                 $randValue = $this->getIntMaxBetween($randMaxValue, $intMaxValue);
17             } else {
18                 $temp_a = mt_rand(0, substr($randMaxValue, -$intMaxValueLen));    //低位
19                 
20                 if ($temp_a > $intMaxValue) {
21                     $temp_a = $this->getIntMaxBetween($temp_a, $intMaxValue);
22                 }
23                 
24                 $temp_b = mt_rand(0, substr($randMaxValue, 0, ($maxValueLen - $intMaxValueLen)));    //高位
25                 $randValue = $temp_a + $temp_b * pow(10,$intMaxValueLen);
26             }
27         }else{
28             $randValue = mt_rand(0, $randMaxValue);
29         }
30         
31         return $randValue;
32     }
33     
34     public function getIntMaxBetween($a, $b) {
35         if ($a > $b) {
36             $divideNumber = intval($a/$b);
37             $modNumber = intval($a%$b);
38             
39             $returnVal = 0;
40             
41             //$returnVal = mt_rand(0,$divideNumber) * mt_rand(0,$b);
42             if ($divideNumber > 10) {
43                 $returnVal += mt_rand(0,$divideNumber) * mt_rand(0,$b);
44             } else {
45                 for($m = 0; $m < $divideNumber; $m++) {
46                     $returnVal += mt_rand(0,$b);
47                 }
48             }
49             
50             if ($modNumber > 0) {
51                 $returnVal += mt_rand(0,$modNumber);
52             }
53             
54             return $returnVal;
55         } else {
56             $returnVal = mt_rand(0, $a);
57         }
58         
59         return $returnVal;
60     }

调用:$randValue = $this->my_mt_rand($randMaxValue);//获取随机数

posted @ 2013-12-06 15:56  幻星宇  阅读(2326)  评论(0编辑  收藏  举报