PHP 随机生成 X 位数字

89
我需要创建一个有x位数字的随机数。
比如,如果x是5,我需要一个类似35562的数字。 如果x是3,则会返回类似463的数字。
有人能向我展示如何做到这一点吗?
22个回答

2

使用循环来完成:

function randomWithLength($length){

    $number = '';
    for ($i = 0; $i < $length; $i++){
        $number .= rand(0,9);
    }

    return (int)$number;

}

2

randmt_rand都可以使用...

用法:

rand(min, max);

mt_rand(min, max);

1
OP正在寻找一种方法来创建一个具有x位数字的随机数;您能否调整您的答案,提供如何使用randmt_rand来实现这一点的示例? - user212218

2
以下是生成指定长度验证码的简单方法。可以指定长度,默认情况下生成4位数字代码。
function get_sms_token($length = 4) {

    return rand(
        ((int) str_pad(1, $length, 0, STR_PAD_RIGHT)),
        ((int) str_pad(9, $length, 9, STR_PAD_RIGHT))
    );
}

echo get_sms_token(6);

2
function random_number($size = 5)
{
    $random_number='';
    $count=0;
    while ($count < $size ) 
        {
            $random_digit = mt_rand(0, 9);
            $random_number .= $random_digit;
            $count++;
        }
    return $random_number;  
}

1
虽然这段代码可能回答了问题,但提供有关为什么和/或如何回答问题的附加上下文将显着提高其长期价值。请编辑您的答案以添加一些解释。 - Toby Speight

0
以下代码生成一个4位数的随机数:
echo sprintf( "%04d", rand(0,9999));

echo sprintf()是一种“反模式”。绝对没有任何理由让任何人编写echo sprintf() - 每次都应该是没有echoprintf()。这个答案并不适合满足提问者的动态需求。 - mickmackusa

0
这是另一种简单的方法来生成N位随机数:
$number_of_digits = 10;
echo substr(number_format(time() * mt_rand(),0,'',''),0,$number_of_digits);

请在此处查看:http://codepad.org/pyVvNiof


0

这个函数完美地工作,没有重复的数字,并且指定了所需的位数。

$digits = '';
function randomDigits($length){
    $numbers = range(0,9);
    shuffle($numbers);
    for($i = 0; $i < $length; $i++){
        global $digits;
        $digits .= $numbers[$i];
    }
    return $digits;
}

你可以调用函数并传递数字的数量,例如:
randomDigits(4);

示例结果:

4957 8710 6730 6082 2987 2041 6721

this gist获取的原始脚本。


0
请注意,根据文档,rand()不会生成加密安全的值。

http://php.net/manual/en/function.rand.php

该函数不生成加密安全的值,不应用于加密目的。如果您需要加密安全的值,请考虑使用random_int()、random_bytes()或openssl_random_pseudo_bytes()。

相反,最好使用PHP 7中提供的random_int()(请参见:http://php.net/manual/en/function.random-int.php)。

因此,为了扩展@Marcus的答案,您应该使用:

function generateSecureRandomNumber($digits): int {
   return random_int(pow(10, $digits - 1), pow(10, $digits) - 1);
}

function generateSecureRandomNumberWithPadding($digits): string {
   $randomNumber = random_int(0, pow(10, $digits) - 1);
   return str_pad($randomNumber, $digits, '0', STR_PAD_LEFT);
}

请注意,如果您不需要安全的随机数,则使用rand()是可以的。

你能解释一下什么是安全数字吗? - maswerdna
一个具有密码学安全性的随机数对于黑客来说更难预测。请记住,随机数生成并不是真正的随机。例如,如果随机数用于创建 PIN 码,则需要确保其安全,以防止黑客破解。如果随机数用于动画,则无需担心黑客能够预测将要生成的随机数。 - Yahya Uddin
感谢您的回复。我需要更深入地研究随机数生成。这句话:“请记住,随机数生成并不是真正的随机”让我再次感到困惑。您的意思是因为在幕后肯定有一种模式或算法在起作用吗?如果是这样,那么隐藏生成过程就足够安全了吗? - maswerdna
这可能会有所帮助:https://paragonie.com/blog/2015/07/how-safely-generate-random-strings-and-integers-in-php 随机数生成器基于种子值。如果您知道种子值,您将知道所有随机数的顺序。 我不确定加密随机数字是如何实现的,但它们比弱随机数生成器更安全。 - Yahya Uddin
谢谢。我会仔细阅读,看看能否学到一些新东西。 - maswerdna

0

这个简单的脚本就可以了

$x = 4;//want number of digits for the random number
$sum = 0;


for($i=0;$i<$x;$i++)
{
    $sum = $sum + rand(0,9)*pow(10,$i);

}

echo $sum;

0
function rand_number_available($already_mem_array,$boundary_min,$boundary_max,$digits_num)
{

    $already_mem_array_dim = count($already_mem_array);         // dimension of array, that contain occupied elements

    // --- creating Boundaries and possible Errors
    if( empty($digits_num) ){   
            $boundary_dim = $boundary_max - $boundary_min;
            if($boundary_dim <= 0){
                $error = -1;                                    // Error that might happen. Difference between $boundary_max and $boundary_min must be positive
            }else{
                $error = -2;                                    // Error that might happen. All numbers between, $boundary_min and $boundary_max , are occupied, by $already_mem_array
            }                                   
    }else{
            if($digits_num < 0){                                // Error. If exist, $digits_num must be, 1,2,3 or higher
                $error = -3; 
            }elseif($digits_num == 1){                          // if 'one-figure' number
                $error = -4;                                    // Error that might happen. All 'one-figure' numbers    are occupied, by $already_mem_array
                $boundary_min = 0;
                $boundary_max = 9;
                $boundary_dim = $boundary_max-$boundary_min;
            }elseif($digits_num == 2){                          // if 'two-figure' number
                $error = -5;                                    // Error that might happen. All 'two-figure' numbers    are occupied, by $already_mem_array
                $boundary_min = 10;
                $boundary_max = 99;
                $boundary_dim = $boundary_max-$boundary_min;
            }elseif($digits_num>2){                             // if 'X-figure' number. X>2
                $error = -6;                                    // Error that might happen. All 'X-figure' numbers  are occupied, by $already_mem_array. Unlikely to happen
                $boundary_min = pow(10, $digits_num-1);         // stepenovanje - graduation
                $boundary_max = pow(10, $digits_num)-1;
                $boundary_dim = $boundary_max-$boundary_min;
            }

    }
    // -------------------------------------------------------------------


    // --- creating response ---------------------------------------------
    if( ($already_mem_array_dim <= $boundary_dim)   &&  $boundary_dim>0 ){              // go here only if, there are AVAILABLE numbers to extract, and [difference] $boundary_dim , is positive
        do{
            $num = rand($boundary_min,$boundary_max);
        }while( in_array($num, $already_mem_array) );
        $result = $num;
    }else{
        $result = $error;                                       // Limit that happened  
    }

    return $result;
    // -------------------------------------------------------------------

}

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