【问题标题】:Generate random number in Laravel在 Laravel 中生成随机数
【发布时间】:2014-09-13 02:01:35
【问题描述】:

请在 Laravel 上进行一个项目,我想以这种格式生成一个随机数:一个字符按任何位置顺序,其余整数。示例:C87465398745635、87474M745436475、98487464655378J8 等,这是我的控制器:

    function generatePin( $number ) {
    $pins = array();
    for ($j=0; $j < $number; $j++) { 
        $string = str_random(15);
        $pin = Pin::where('pin', '=', $string)->first();
        if($pin){
            $j--;
        }else{
            $pins[$j] = $string;
        }
    }



    return $pins;
}

但它似乎正在生成类似这样的其他东西:ZsbpEKw9lRHqGbv, i7LjvSiHgeGrNN8, pyJEcjhjd3zu9Su 我已经尽我所能但没有成功,请任何帮助解决方案将不胜感激,谢谢

【问题讨论】:

  • 问题的标题有误导性,它问的是一个随机数,但问题显然是一个随机字符串

标签: php string random laravel


【解决方案1】:

如果你想像你说的那样生成随机字符串,替换:

$string = str_random(15);

// Available alpha caracters
$characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

// generate a pin based on 2 * 7 digits + a random character
$pin = mt_rand(1000000, 9999999)
    . mt_rand(1000000, 9999999)
    . $characters[rand(0, strlen($characters) - 1)];

// shuffle the result
$string = str_shuffle($pin);

编辑:

以前,代码不会一直生成随机的字母字符。那是因为 Laravel 的 str_random 会生成一个随机的字母数字字符串,有时该函数会返回一个数值 (see docs)。

【讨论】:

  • 感谢这项工作并将这些作为结果给我:F2360463118, 54475708163, 8N182992222, 4629231O991, 1V387422817 但是缺少什么,我的观察是: 1. 这里的第二个生成数字(54475708163)没有任何Alpha-Character 这可能意味着有些人会添加 Alpha-Character,而有些人不会添加 Alpha-Character,这不好或内联和 2。我希望数字是 14 位数字和一个字母使其总共 15 个而不是 9 位数字和 1 个 Alpha -我们在这里的角色谢谢,我真的很感激!
  • 3.请我希望这种方法不会允许重复每个生成的号码,因为这个生成的号码将同时分配给不同的人,如果重复,用户给定的生成号码将会发生冲突。请问 mt_rand 有多安全,数字会在哪个时间间隔再次重复?谢谢
  • 我已经更新了答案。至于你的 cmets: 1. 对不起,那是真的。我和你一样使用 Laravel 的 str_random 函数,该函数生成一个随机的字母数字字符串。 2.对不起,在更新的答案中更正了。 3. 我想说这种方法不太可能产生相同的值,但它是可能的。如果你想要一个真正安全的生成器,我建议你看看这个函数php.net/manual/en/function.openssl-random-pseudo-bytes.php
  • 谢谢你做了这么多,减少了我的脑裂。一切正常,但是如果我可以使用您刚刚在我上面的代码中推荐的 Secure Openssl 随机伪字节,它将如何实现?再次感谢!
  • 答案应该使用random_int而不是mt_rand,并且不应该使用str_shufflerandom_int 是在 PHP 7 中引入的,它使用加密随机生成器,如果字符串必须难以猜测,这一点很重要。由涉及time()microtime()uniqid()rand()mt_rand()str_shuffle()array_rand() 的解决方案生成的字符串更加可预测,并且如果随机字符串用作密码、承载凭证、会话标识符、“确认码”或其他秘密值。
【解决方案2】:

使用函数 rand。

例子:

 echo rand(0, 99999);

【讨论】:

    【解决方案3】:

    这应该给你 2 到 50 之间的随机数。

    $randomId       =   rand(2,50);
    

    【讨论】:

      【解决方案4】:

      假设你传递给generatePin的$number是pin的长度:

      function generatePin( $number ) {
          // Generate set of alpha characters
          $alpha = array();
          for ($u = 65; $u <= 90; $u++) {
              // Uppercase Char
              array_push($alpha, chr($u));
          }
      
          // Just in case you need lower case
          // for ($l = 97; $l <= 122; $l++) {
          //    // Lowercase Char
          //    array_push($alpha, chr($l));
          // }
      
          // Get random alpha character
          $rand_alpha_key = array_rand($alpha);
          $rand_alpha = $alpha[$rand_alpha_key];
      
          // Add the other missing integers
          $rand = array($rand_alpha);
          for ($c = 0; $c < $number - 1; $c++) {
              array_push($rand, mt_rand(0, 9));
              shuffle($rand);
          }
      
          return implode('', $rand);
      }
      

      【讨论】:

        【解决方案5】:

        您可以使用rand() 函数生成一个随机数。 您还可以创建一些字符并在 rand() 前面加上前缀。

        【讨论】:

          【解决方案6】:

          生成随机数

          echo generateRandomString(6) // Ex j4nDqQRiYafD
          

          实施

          function generateRandomString(int $n=0)
          {
            $al = ['a','b','c','d','e','f','g','h','i','j','k'
            , 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
            'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E',
            'F','G','H','I','J','K', 'L', 'M', 'N', 'O', 'P',
            'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            '0', '2', '3', '4', '5', '6', '7', '8', '9'];
          
            $len = !$n ? random_int(7, 12) : $n; // Chose length randomly in 7 to 12
          
            $ddd = array_map(function($a) use ($al){
              $key = random_int(0, 60);
              return $al[$key];
            }, array_fill(0,$len,0));
            return implode('', $ddd);
          }
          

          使用range函数

          range — 创建一个包含一系列元素的数组 创建一个包含一系列元素的数组。

          使用array_rand函数

          从数组中选择一个或多个随机条目,并返回随机条目的键(或多个键)。它使用不适合加密目的的伪随机数生成器。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-01-03
            • 2011-09-05
            • 2012-12-16
            • 2019-05-15
            • 2016-01-26
            • 2013-11-13
            相关资源
            最近更新 更多