rand值出现负数的解决方案

时间:2022-06-02 08:30:10

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

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

 public function my_mt_rand($randMaxValue) {
$intMaxValue = pow(2,31) - 1; //rand函数最大值
$maxValueLen = strlen($randMaxValue); //最大值的长度
$intMaxValueLen = strlen($intMaxValue); //rand函数最大值的长度 /*if($randMaxValue>$intMaxValue){
$randValue = mt_rand(0, $intMaxValue);
}else{
$randValue = mt_rand(0, $randMaxValue);
}
return $randValue;*/ if ($randMaxValue > $intMaxValue) {
if ($maxValueLen == $intMaxValueLen) {
//$randValue = mt_rand(0, $intMaxValue);
$randValue = $this->getIntMaxBetween($randMaxValue, $intMaxValue);
} else {
$temp_a = mt_rand(0, substr($randMaxValue, -$intMaxValueLen)); //低位 if ($temp_a > $intMaxValue) {
$temp_a = $this->getIntMaxBetween($temp_a, $intMaxValue);
} $temp_b = mt_rand(0, substr($randMaxValue, 0, ($maxValueLen - $intMaxValueLen))); //高位
$randValue = $temp_a + $temp_b * pow(10,$intMaxValueLen);
}
}else{
$randValue = mt_rand(0, $randMaxValue);
} return $randValue;
} public function getIntMaxBetween($a, $b) {
if ($a > $b) {
$divideNumber = intval($a/$b);
$modNumber = intval($a%$b); $returnVal = 0; //$returnVal = mt_rand(0,$divideNumber) * mt_rand(0,$b);
if ($divideNumber > 10) {
$returnVal += mt_rand(0,$divideNumber) * mt_rand(0,$b);
} else {
for($m = 0; $m < $divideNumber; $m++) {
$returnVal += mt_rand(0,$b);
}
} if ($modNumber > 0) {
$returnVal += mt_rand(0,$modNumber);
} return $returnVal;
} else {
$returnVal = mt_rand(0, $a);
} return $returnVal;
}

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