防止随机PHP生成器包含零

4
我有一个PHP脚本,可以创建一个随机的10位订单号:
// Assign order number length
$digits = 10;

// Create random order number to be stored with this order
$order_number = rand(pow(10, $digits-1), pow(10, $digits)-1);

我该如何防止在生成随机的10位数字中出现数字零0?先谢谢了!


1
为什么你在使用pow()作为rand()的参数来创建随机数? - djot
@djot: 根据给定的数字计算范围? - Adassko
5个回答

4
你可以使用花式进制转换,但最直接的方法是获取字符串:
function random_string($count, $available) {
    $result = '';
    $max = strlen($available) - 1;

    for($i = 0; $i < $count; $i++) {
        $result .= $available[rand(0, $max)];
    }

    return $result;
}

…
$order_number = random_string($digits, '123456789');

这并没有回答问题;如果 rand(0, 9) 返回 0,那么数字将包含一个 0。我想你的意思是 rand(1, 9) - George Brighton
1
或者只需将零保留在$digits字符串之外... - poke
然后您需要将 rand() 调用更改为 rand(0, 8) :) 就个人而言,我不会费心去使用 $digits,而是直接使用 rand() 的结果(请参见我的答案)。 - George Brighton

3
你可以将它看作是九进制的数字。
base_convert(rand(0, pow(9, $digits) - 1), 10, 9)

这将为您提供0到8位数字。

现在只需将每个数字加1,使其变为1到9。

(pow(10, $digits) - 1) / 9

这将会给你一个由数字1组成的数字。现在只需将其加到您之前的数字上即可:

$digits = 10;

$order_number = (pow(10, $digits) - 1) / 9 + base_convert(rand(0, pow(9, $digits) - 1), 10, 9);

这个9从哪里来的? - Adassko
哦,基数是9!我收回了,聪明的家伙。=) - Alix Axel
然而,这种方法对于10位数不起作用,因为PHP的randmt_rand函数是有限制的。有一个简单的解决方法,就是将两个5位数连接在一起或者只连接最后一位数字再加上. rand(1,9) - Adassko

2
尝试这个 :D
function getRandom($from, $to){
    $num = rand($from, $to);
    $have_zero = true;
    $strNum = strval($num);
    while ($have_zero){
        $have_zero = false;
        for ($i = 0; $i < sizeof($strNum); $i++){
            if ($strNum[$i] == '0'){
                $have_zero = true;
                $num = rand($from, $to);
                $strNum = strval($num);
                break;
            }
        }
    }
    return $num;
}
getRandom(1111111111, 9999999999);

1
你可以使用像这样的简单函数:
```html

您可以使用以下简单函数:

```
function getRandom($length) {
    $numbers = '';
    for($i = 0; $i < $length; $i++) {
        $numbers .= rand(1, 9);
    }
    return $numbers;
}

echo getRandom(10);

1
我会制作一个函数。
<?php

function myRandomNumberWithoutZeros($digits)
{
    $result = str_replace("0", "",rand(pow(10,$digits-1), pow(10, $digits)-1)."");
    $resultLength = strlen($result);
    if($resultLength < $digits)
    {
        return intval($result.myRandomNumberWithoutZeros($digits-$resultLength));
    }
    return intval($result); 
}
echo myRandomNumberWithoutZeros(10);

?>

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