产生具有预定义长度的PHP的随机数(Generate a random number with pr

2019-08-02 04:22发布

我试图创建,以产生一个真正的随机数的使用功能mt_rand(),因为RAND()恰恰是不够的。

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

反正,我一直插科打诨,这是我想出:

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

从理论上讲,应该工作(据我可以告诉),但事实并非如此。 长度完全是随机的,它也抛出负值。

有任何想法吗?

Answer 1:

除非你有这些量子静电一样的东西之一,你不能得到真正的随机数。 在基于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的范围不是无限的。 负数的整数溢出。



Answer 2:

简短而亲切的:

我假设只有合法的数字,而不是像00010串尝试期运用你的号码的大小为:

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

不工作的只有一个是当长度为1时,一个单一的数字数“0”将不被返回的可能值。



Answer 3:

下面是我使用的是什么:

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任何其他地方。



Answer 4:

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

第一行确保没有“0”之前的任何号码,例如像值012,0598 ......将被丢弃,剩下的就是容易



Answer 5:

使用此一定长度与字母和数字的字符串。 测试。

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


Answer 6:

你不应该用长度约束的随机数开始。 而是积累了足够长的输出,然后将其剪切到合适的长度:

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

填充应该有,因为即使零是随机生成的,应予以保留。



Answer 7:

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

你有你在错误的地方CONCAT 1,你的范围是本作$长度= 2:{} 01,99 - 有时它的01-09,即表示为1-9不是01-09。 10刚开始:{} 10,99将是你的范围。



Answer 8:

这个怎么样:

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


文章来源: Generate a random number with pre-defined length PHP