PHP的随机X位数


73

我需要使用x位数创建一个随机数。

因此,假设x为5,我需要一个数字,例如。35562如果x为3,则它将抛出类似的内容;463

有人可以告诉我这是怎么做的吗?

Answers:


172

您可以将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; 回声random_int(10 **($ digits-1),(10 ** $ digits)-1);
乔先生

有史以来最好的答案
sta


16

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

$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

1
好吧,改组似乎是个好主意,但不会产生重复的数字/字符,例如2312,abcb等...
Pranav Raut

12

您可以使用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
Michael Berkowski

他不知道一个最小/最大,仅在数字的可预期的号码长度
勒内锅

它总是给1000
Shahid Chaudhary

9

将您的数字视为数字列表,并且每次都只附加一个随机数字:

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);
}

7
function random_numbers($digits) {
    $min = pow(10, $digits - 1);
    $max = pow(10, $digits) - 1;
    return mt_rand($min, $max);
}

在这里测试。


该输出也将以前导零开头吗?
2011年

您是否需要它的前导零?它已经是x数字长了。编辑:没关系,我想我理解你。不,它不会创建类似“ 093”的数字。
animuson

很难改变吗?猜没关系。
2011年

如果您希望5位数字允许使用“ 00937”之类的数字,则不难更改。
animuson

7

我能想到的最简单的方法是将rand函数与str_pad

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

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

并且有5位数字。


6

rand(1000, 9999); 比x4更快地工作 rand(0,9);

基准:

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

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


2
OP正在要求一种创建带有x位数字的随机数的方法。也许您可以编辑答案以匹配问题?
jorgenkg '17

2

循环执行:

function randomWithLength($length){

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

    return (int)$number;

}

2

rand还是mt_rand会...

用法:

rand(min, max);

mt_rand(min, max);

OP正在寻找一种创建带有x数字的随机数的方法。您能否调整答案以提供使用randmt_rand执行此操作的示例?

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

2

好吧,您可以使用简单的PHP函数mt_rand(2000,9000)来生成4位数字的随机数

mt_rand(2000,9000) 

1

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

阅读更多

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


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

}

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

这个要点得到的原始剧本


0

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

http://php.net/manual/zh/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()如果您不需要安全的随机数,可以使用。


您能解释一下安全号码的意思吗?
maswerdna

黑客很难预测密码安全的随机数。请记住,随机数生成并不是真正的随机。例如,如果使用随机数来创建图钉,则需要确保它的安全性,以防止黑客弄清楚它。如果该随机数用于动画制作,则无需担心黑客是否可以预测随机数。
Yahya Uddin

感谢您的答复。我将不得不更深入地研究随机数的生成。这:Remember random number generation is not truly random让我再次困惑。您的意思是因为肯定会有某种模式或算法在后台运行?如果这就是您的意思,那么隐藏生成过程是否足够的安全性?
maswerdna

这可能会有所帮助:paragonie.com/blog/2015/07/…随机数生成器基于种子值。如果知道种子值,则将知道所有随机数的顺序。我不确定如何实现密码随机数,但是它们比弱随机数生成器更安全。
Yahya Uddin

感谢那。我会通读一下,看看是否可以学习新知识。
maswerdna

0

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

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

0

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

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

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

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

例如

$x = "102384129" . complex_3_digit_random_string();

变成

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

完成。


这不能回答OP问题。
Paulo Freitas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.