随机生成一个由15个字符组成的正数。

3

我正在尝试使用php生成正好15个字符长且为正数的随机数。我尝试了rand(100000000000000, 900000000000000),但它仍会生成负数和小于15的数字。我是否遗漏了其他能够完成此操作的函数,或者我应该使用rand(0,9) 15次并连接结果?


2
就此而言,“rand”并没有出错,只是您使用的数字比您机器上的“int”大小要大,这就是为什么您会看到奇怪的结果。 - Mike Park
可能是[在PHP中使用long int]的重复问题(https://dev59.com/BWoy5IYBdhLWcg3wScPb)。 - Peter O.
4个回答

9
$i = 0;
$tmp = mt_rand(1,9);
do {
    $tmp .= mt_rand(0, 9);
} while(++$i < 14);
echo $tmp;

1
int mt_rand ( int $min , int $max ) 是一个好的选择。我会使用这个答案。+1 - ROY Finley
@ROYFinley mt_rand() 有什么特别之处? - Eboubaker
1
@ZOLDIK:在PHP 7.1之前存在问题(https://dev59.com/Zl4b5IYBdhLWcg3wtjzY#28760905)。现在这些问题已经通过将`rand()`作为`mt_rand()`的别名来解决。 - Tigger

3

您正在使用32位平台。要处理这些整数,需要64位平台。

您可以执行两次rand并将其保存为字符串,如下所示:

$num1 = rand(100000,999999);
$num2 = rand(100000,999999);
$num3 = rand(100,999);
$endString = $num1.$num2.$num3;

附注:我认为Tigger的解决方案比我的好。


安全范围在20亿以内(10个字符),因此使用7位数的mt_rand和8位数的另一个mt_rand即可,同时将9000000改为99999999。 - CSᵠ
你说得对。我不确定数字,所以我采取了保险措施。 - Green Black
1
最大值为2,147,483,647,因此有效数字为9位。 - CSᵠ

1

给你。

function moreRand($len) { 
    $str = mt_rand(1,9);
    for($i=0;$i<$len-1;$i++) { 
        $str .= mt_rand(0, 9);
    }
    return $str;
}
echo moreRand(15); 

编辑:如果您想要减少0.00045秒的执行时间,

 function randNum() { return abs(rand(100000000000000, 900000000000000)); }

1
请记住,这可能会返回0作为第一个“数字”,从技术上讲,这将是一个14位数。 - Supericy
糟糕,注意力不集中。已修复。 - Josh Brody

1
请记住,这将返回一个字符串,而不是实际的整数值。
function randNum($length)
{
    $str = mt_rand(1, 9); // first number (0 not allowed)
    for ($i = 1; $i < $length; $i++)
        $str .= mt_rand(0, 9);

    return $str;
}

echo randNum(15);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接