php随机x位数

Posted

技术标签:

【中文标题】php随机x位数【英文标题】:php random x digit number 【发布时间】:2012-01-03 04:45:01 【问题描述】:

我需要创建一个包含 x 位数的随机数。

假设 x 是 5,我需要一个数字,例如。 35562 如果 x 是 3,那么它会抛出类似的东西; 463

谁能告诉我这是怎么做到的?

【问题讨论】:

【参考方案1】:

以下是生成特定长度验证码的简单方法。长度可指定,默认生成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】:

以下代码生成一个4位随机数:

echo sprintf( "%04d", rand(0,9999));

【讨论】:

【参考方案3】:

您可以使用 mt_rand() 函数生成任何 x 位随机数。 mt_rand() 使用 rand() 函数更快 语法:mt_rand()mt_rand($min , $max)

read more

示例:<?php echo mt_rand(); ?>

【讨论】:

【参考方案4】:

你可以使用简单的 php 函数 mt_rand(2000,9000) 来生成一个 4 位随机数

mt_rand(2000,9000) 

【讨论】:

【参考方案5】:

请注意 rand() 不会根据文档生成加密安全值:

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

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

最好使用random_int(),它在 PHP 7 上可用(参见: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() 即可。

【讨论】:

您能解释一下安全号码是什么意思吗? 一个密码安全的随机数对于黑客来说更难预测。请记住,随机数的生成并不是真正随机的。例如,如果使用随机数创建一个 pin,您需要它的安全性以防止黑客发现它。如果随机数是用于动画的,那么黑客是否可以预测随机数将是什么也不用担心。 感谢您的回复。我将不得不更深入地研究随机数的生成。这:Remember random number generation is not truly random 让我再次感到困惑。你的意思是因为肯定会有一种模式或算法在幕后工作?如果这就是你的意思,隐藏生成过程是否足够安全? 这可能会有所帮助:paragonie.com/blog/2015/07/… 随机数生成器基于种子值。如果你知道种子值,你就会知道所有随机数的顺序。我不确定如何实现加密随机数,但它们比弱随机数生成器更安全。 谢谢。我会通读一遍,看看能不能学到新东西。【参考方案6】:

此功能完美运行,没有重复和所需的位数。

$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

【讨论】:

【参考方案7】:

这是一个简单的解决方案,没有任何循环或任何麻烦 允许您创建带有字符、数字甚至特殊符号的随机字符串。

$randomNum = substr(str_shuffle("0123456789"), 0, $x);

$x 可以是位数

例如。 substr(str_shuffle("0123456789"), 0, 5);

执行几次后的结果

98450
79324
23017
04317
26479

您也可以使用相同的代码生成随机字符串,像这样

$randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyzABCDEFGHIJKLMNOPQRSTVWXYZ"), 0, $x);

$x = 11 的结果

FgHmqpTR3Ox
O9BsNgcPJDb
1v8Aw5b6H7f
haH40dmAxZf
0EpvHL5lTKr

【讨论】:

嗯,改组似乎是个好主意,但它不会生成重复的数字/字符,例如 2312、abcb 等......【参考方案8】:
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;
    // -------------------------------------------------------------------


【讨论】:

【参考方案9】:

rand(1000, 9999); 的运行速度比 rand(0,9); 快 4 倍

基准测试:

rand(1000, 9999)      : 0.147 sec.
rand(0,9)x4 times     : 0.547 sec.

这两个函数都运行了 100000 次迭代,以使结果更加明确

【讨论】:

OP 正在寻求一种方法来创建一个包含 x 位数字的随机数。也许您可以编辑您的答案以匹配问题?【参考方案10】:
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;  

【讨论】:

虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的额外上下文将显着改善其长期-期限价值。请edit你的答案添加一些解释。【参考方案11】:

我能想到的最简单的方法是使用rand 函数和str_pad

<?php
echo str_pad(rand(0,999), 5, "0", STR_PAD_LEFT);
?>

在上面的例子中,它将生成 0 到 999 范围内的随机数。

并且有 5 个数字。

【讨论】:

我认为这是迄今为止提到的最合适和最有效的解决方案。它不使用任何循环,不使用保证数字可以在结果中多次存在的随机播放,不需要大量代码来保证结果包含 x 位。【参考方案12】:

这是另一种生成 N 位随机数的简单解决方案:

$number_of_digits = 10;
echo substr(number_format(time() * mt_rand(),0,'',''),0,$number_of_digits);

在这里查看:http://codepad.org/pyVvNiof

【讨论】:

【参考方案13】:

这个简单的脚本就可以了

$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;

【讨论】:

【参考方案14】:

你们真的很喜欢把事情复杂化:)

真正的问题是 OP 可能希望将其添加到一些非常大的数字的末尾。如果没有,我认为没有必要这样做。因为任何数字中的左零都只是左零。

所以,只需将该数字的较大部分附加为数学总和,而不是字符串。

例如

$x = "102384129" . complex_3_digit_random_string();

变成了

$x = 102384129000 + rand(0, 999);

完成。

【讨论】:

这不能回答 OP 问题。【参考方案15】:

randmt_rand 可以...

用法:

rand(min, max);

mt_rand(min, max);

【讨论】:

OP 正在寻找一种方法来创建一个包含x 数字的随机数;您能否调整您的答案以提供如何使用randmt_rand 执行此操作的示例?【参考方案16】:

您可以将rand()pow() 一起使用来实现这一点:

$digits = 3;
echo rand(pow(10, $digits-1), pow(10, $digits)-1);

这将输出一个介于 100 和 999 之间的数字。这是因为 10^2 = 100 和 10^3 = 1000,然后您需要将其减去 1 以使其在所需范围内。

如果 005 也是一个有效示例,您可以使用以下代码用前导零填充它:

$digits = 3;
echo str_pad(rand(0, pow(10, $digits)-1), $digits, '0', STR_PAD_LEFT);

【讨论】:

更简洁的方式:$digits = 3; echo random_int( 10 ** ( $digits - 1 ), ( 10 ** $digits ) - 1); 最佳答案 我决定将@Mr.Jo 的评论与实际答案进行基准测试,以下是基于总执行时间(以纳秒为单位)的结果:5 Number=> marcusVersion(): 36,916 ns; mrJoVersion(): 27,769 ns 10 数字=> marcusVersion(): 11,116 ns; mrJoVersion(): 41,748 ns 15 数字=> marcusVersion(): 17,543 ns; mrJoVersion(): 60,442 ns 20 数字=> marcusVersion(): 20,373 ns; mrJoVersion(): 77,534 ns 你的选择应该取决于你一次生成多少个数字【参考方案17】:

将您的号码视为数字列表,每次只需附加一个随机数字:

function n_digit_random($digits) 
  $temp = "";

  for ($i = 0; $i < $digits; $i++) 
    $temp .= rand(0, 9);
  

  return (int)$temp;


或者纯数值解:

function n_digit_random($digits)
  return rand(pow(10, $digits - 1) - 1, pow(10, $digits) - 1);

【讨论】:

【参考方案18】:

您可以使用rand($min, $max) 来达到这个目的。

为了将值限制为具有 x 位的值,您可以使用以下内容:

$x = 3; // Amount of digits
$min = pow(10,$x);
$max = pow(10,$x+1)-1);
$value = rand($min, $max);

【讨论】:

OP 要求一个带有$x 数字的数字,而不是某个数字和$x 之间的数字。 他不知道最小/最大,只知道预期数字的长度 它总是给 1000【参考方案19】:
function random_numbers($digits) 
    $min = pow(10, $digits - 1);
    $max = pow(10, $digits) - 1;
    return mt_rand($min, $max);

经过测试here。

【讨论】:

这个输出的数字也会带前导零吗? 你需要它有前导零吗?它已经是x 数字长了。 编辑:没关系,我想我理解你。不,它不会创建像“093”这样的数字。 很难改变吗?估计没关系。 如果您想允许像“00937”这样的数字作为 5 位数字,不,更改并不难。【参考方案20】:

用循环来做:

function randomWithLength($length)

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

    return (int)$number;


【讨论】:

【参考方案21】:

我通常只使用RAND() http://php.net/manual/en/function.rand.php

例如

rand ( 10000 , 99999 );

为你的 5 位随机数

【讨论】:

以上是关于php随机x位数的主要内容,如果未能解决你的问题,请参考以下文章

分位数和上侧分位数如何定义?

如何用php生成一个16位数的id 并在指定的文件创建id文件夹

用php生成一个可选位数的数字和英文随机码

如何理解概率分布的分位数和上侧分位数?

6位数随机验证码

怎么用Python做随机八位数密码