【问题标题】:PHP: Generate random Code excluding (0, 1, O and L)PHP:生成不包括(0、1、O 和 L)的随机代码
【发布时间】:2016-07-02 10:24:36
【问题描述】:

我正在尝试使用以下规则生成随机优惠券代码:

大写字母数字组合 5 个字符(A-Z、0-9 和带走 1、0、I、O)。

这是我的尝试

<?php
function generateRandomString($length = 5) {
    return substr(str_shuffle("23456789ABCDEFGHIJKMNPQRSTUVWXYZ"), 0, $length);
}


echo generateRandomString();
?>

但我不确定是否有更好的方法来做到这一点

【问题讨论】:

    标签: php algorithm random


    【解决方案1】:

    如果你需要多次调用这个函数,你当前的实现会很慢,因为它使用的随机函数调用比必要的多得多(如果 $length

    更准确一点的解决方案是使用array_rand()

    function generateRandomString($length = 5) {
      $allowed = str_split('23456789ABCDEFGHIJKMNPQRSTUVWXYZ'); // it is enough to do it once
    
      $res = '';
      foreach (array_rand($allowed, $length) as $k)
        $res .= $allowed[$k];
      return $res;
    }
    

    【讨论】:

    • 我的尝试更好,因为我不循环
    • 是的,您的代码可以在没有循环的情况下工作。但是如果$length==50,您的代码将失败。而且它也很慢,因为str_shuffle 调用慢速random 函数32 次而不是$length 次。如果您需要生成数百万个短随机字符串,这将是一个问题。
    【解决方案2】:

    如果您需要一个比您的字符集更长的字符串,该方法将失败。请你试试下面的代码;

    <?php
        function generateRandomString($length = 5) {
            $chars = "23456789ABCDEFGHIJKMNPQRSTUVWXYZ"; //Your char-set
            $charArray = str_split($chars); //Your array representation of chars
            $charCount = strlen($chars); //Your char-set length
            $result = "";
    
            //Loop throught required `$length`
            for($i=1;$i<=$length;$i++)
            {
                $randChar = rand(0,$charCount-1); //Pick a random char in range of our chars
                $result .= $charArray[$randChar]; //Concatenate picked char to result
            }
            return $result;
        }
    
    
        echo generateRandomString(75);
    ?>
    

    这是一个工作示例:https://ideone.com/D1EQ9T 希望这会有所帮助。

    【讨论】:

    • 我的尝试更好,因为我不循环
    • @Dahab 这不是用于您的目的的指标,如果您需要一个长度超过 32 个字符的字符串,您的方法将失败 + 您不会得到一个字符重复的字符串,如 AA789 或 ABB55。此方法的总执行时间为 0.01 - 0.02 秒,您仍然可以改进它以供并发使用。
    【解决方案3】:
    function generateRandom($length = 5) {
        $possibleChars = '123456789ABCDEFGHJKMNPQRSTUVWXYZ';
    
        $rndString = '';
        for ($i = 0; $i < $length; $i++) {
            $rndString .= $possibleChars[rand(0, strlen($possibleChars) - 1)];
        }
        return $rndString;
    }
    
    echo generateRandom();
    

    您可以在此处定义您希望在随机字符串中包含的字符。

    您的函数的问题是任何字符每次调用只会使用 1 次。它不是真的随机。并且随机字符串的长度也将受限于您拥有的字符数。

    例如:你的函数不可能实现 AAAAA,而我的函数是。

    【讨论】:

    • 我的尝试更好,因为我不循环
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2014-04-11
    • 1970-01-01
    相关资源
    最近更新 更多