生成具有预定义长度PHP的随机数

时间:2012-10-31 23:46:02

标签: php random numbers

我正在尝试使用mt_rand()创建一个函数,以便生成一个真正的随机数,因为rand()只是不够。

问题是我需要预先定义数字的长度,比如我需要一个10位数的随机数。

无论如何,我一直在搞乱,这就是我想出来的:

    function randomNumber($length) {
        $min = str_repeat(0, $length-1) . 1;
        $max = str_repeat(9, $length);
        return mt_rand($min, $max);   
    }

理论上应该有效(据我所知),但事实并非如此。长度是完全随机的,它也会抛出负值。

有什么想法吗?

11 个答案:

答案 0 :(得分:27)

除非你有一个量子静态的东西,否则你无法获得真正随机的数字。但是,在基于Unix的操作系统上,/dev/urandom适用于“更多随机性”,如果你真的需要它。

无论如何,如果你想要一个n位数字,那就是你应该得到的:n个数字。

function randomNumber($length) {
    $result = '';

    for($i = 0; $i < $length; $i++) {
        $result .= mt_rand(0, 9);
    }

    return $result;
}

您现有代码无效的原因是因为0000...01仍然是1mt_rand,而mt_rand的范围也不是无限的。负数是整数溢出。

答案 1 :(得分:5)

短而甜蜜:

我假设只有合法的数字,而不是00010这样的字符串。请尝试使用您的数字大小:

  $min = pow(10, $length - 1) ;
  $max = pow(10, $length) - 1;
  return mt_rand($min, $max);   

唯一不起作用的是当长度为1时,单个数字“0”将不是可能返回的值。

答案 2 :(得分:5)

以下是我正在使用的内容:

function random_number($length)
{
    return join('', array_map(function($value) { return $value == 1 ? mt_rand(1, 9) : mt_rand(0, 9); }, range(1, $length)));
}

一条线,又好又简单!该数字永远不会以0开头,并且在任何其他地方允许0。

答案 3 :(得分:2)

function randomNDigitNumber($digits)
{
  $returnString = mt_rand(1, 9);
  while (strlen($returnString) < $digits) {
    $returnString .= mt_rand(0, 9);
  }
  return $returnString;
}
  

第一行确保没有&#34; 0&#34;在任何数字之前,例如像012,0598 ......这样的值将被丢弃,其余的很容易

答案 4 :(得分:2)

只需将范围分隔为rand方法,如果您需要4位随机数,则只需将其用作

rand(1000,9999);

答案 5 :(得分:1)

将此用于包含字母和数字的特定长度的字符串。测试

protected function randomToken($length = 4, $result='') {

    for($i = 0; $i < $length; $i++) {

        $case = mt_rand(0, 1);
        switch($case){

            case 0:
                $data = mt_rand(0, 9);
                break;
            case 1:
                $alpha = range('a','z');
                $item = mt_rand(0, 25);

                $data = strtoupper($alpha[$item]);
                break;
        }

        $result .= $data;
    }

    return $result;
}

答案 6 :(得分:0)

您不应该以限制随机数的长度开始。而是累积足够长的输出,然后将其切割到正确的长度:

while (strlen($value) < $length) {
    $value .= str_pad(mt_rand(00000, 99999), 5, "0", STR_PAD_LEFT);
}
// as pairs of five were added before, eventually remove some again
return substr($value, 0, $length);

填充应该在那里,因为偶数零是随机生成的,应该保留。

答案 7 :(得分:0)

function randomNumber($length) {
    $min = 1 . str_repeat(0, $length-1);
    $max = str_repeat(9, $length);
    return mt_rand($min, $max);   
}

你的concat 1在错误的位置,你的范围是$ length = 2:{01,99} - 有时是01-09,表示为1-9而不是01-09。从10开始:{10,99}将是你的范围。

答案 8 :(得分:0)

这个怎么样:

function random($len)
{
    static $track = [];

    $min = 1 . str_repeat(0, $len - 1);
    $max = str_repeat(9, $len);
    $num = mt_rand($min, $max);

    // was this number generated before?
    if (in_array($num, $track))
    {
        // try again
        return random($len);
    }

    return $track[] = $num;
}

通过静态变量(启动一次)跟踪生成的数字将阻止生成相同的数字两次,除非您经历整个范围,在这种情况下,您将陷入无限循环。 例如:

for ($i = 0; $i < 10; $i++)
{
    random(1);
}

答案 9 :(得分:0)

如果环境是本地的,就不需要随机数了,mt_rand 和 rand 一样,但是快了四倍

    protected function generateRandomNumber(int $length = 6)
    {
        $rand = '';
        $env = env('APP_ENV');
        for ($i = 1; $i <= $length; $i++) {
            $rand .= ($env == 'local') ? $i : mt_rand(($i == 1) ? 1 : 0, 9);
        }

        return (int) $rand;
    }

答案 10 :(得分:0)

在这里看到很多答案,为了您的需要,我有一小段有效的代码

<?php
$random_no = mt_rand ( 0000000000 , 9999999999 ); 
// this will generate a 10 digit random number
echo $random_no;
?>