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);//获取随机数

你可能感兴趣的:(解决方案)