【问题标题】:How to generate a random 6-character string with alternating letters and numbers?如何生成具有交替字母和数字的随机 6 字符字符串?
【发布时间】:2017-08-14 02:59:25
【问题描述】:

我有一个 PHP 代码能够生成 6 个字符的字母数字字符串,但它不能确保生成 3 个字母和 3 个数字。

它生成一个字符串,例如“ps7ycn” 字母之间没有 3 个数字。 数字应该在字母之间。

示例:a3g5h9

【问题讨论】:

  • 你的代码在哪里?
  • 数字或字母可以重复吗?可以吗:3r3r3r?字符类型需要交替还是有效:123abc?在发布您的问题之前,您是否在 SO 上搜索了预先存在的答案?
  • 欢迎来到 StackOverflow。请阅读并遵循发布指南:我可以问什么类型的问题stackoverflow.com/help/on-topic,以及如何提问:stackoverflow.com/help/how-to-ask 请记住还要包括最小、完整、可验证的示例:stackoverflow.com/help/mcve。然后,点击edit 编辑您的问题,以便我们提供帮助。

标签: php string random passwords alphanumeric


【解决方案1】:

这将确保您只得到交替的字母和数字:

代码:(Demo)

$letters='abcdefghijklmnopqrstuvwxyz';  // selection of a-z
$string='';  // declare empty string
for($x=0; $x<3; ++$x){  // loop three times
    $string.=$letters[rand(0,25)].rand(0,9);  // concatenate one letter then one number
}
echo $string;

潜在输出:

i9f6q0
j4u5p4
j6l6n9

附言如果你想随机化第一个字符是字母还是数字,在for循环之后使用这行代码。

if(rand(0,1)){$string=strrev($string);}

rand() 将生成01,条件将0 视为false1 视为true。这提供了一个关于是否反转字符串的“硬币翻转”场景。


如果要保证输出中字母和数字的唯一性...

$letters=range('a','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']
shuffle($letters);
$numbers=range(0,9);  // [0,1,2,3,4,5,6,7,8,9]
shuffle($numbers);
$string='';
for($x=0; $x<3; ++$x){
    $string.=$letters[$x].$numbers[$x];
}
echo $string;

【讨论】:

    【解决方案2】:

    试试这个代码:

     $str = '';
     for ( $i = 1; $i <= 6; ++$i ) {
        if ( $i % 2 ) {
         $str .=  chr(rand(97,122));
        }else{
           $str .= rand(0,9);
       }
    }
    

    这个更短,但你不能用它来像 a1g7y5k 那样有奇数长度:

    $str = '';
     for ( $i = 1; $i <= 3; ++$i ) {
      $str .=  chr(rand(97,122)) . rand(0,9);
    }
    

    -或者使用这种可以改进的方法(参考mickmackusa的cmets):

    $alphas  = 'abcdefghijklmnopqrstuvwxyz';
    $numbers = '0123456789';
    $arr1 = str_split($alphas);
    $arr2 = str_split($numbers);
    $arr3 = array_rand($arr1,3);
    $arr4 = array_rand($arr2,3);
    $arr5 = array();
    for ($i=0; $i<count($arr3); $i++) {
       $arr5[] = $arr3[$i];
       $arr5[] = $arr4[$i];
    }
    $result =    implode('',$arr5);
    

    检查this thread。它有一些不错的想法和功能。

    【讨论】:

    • 虽然这些 sn-ps 产生了预期的结果,但我有一些重要的笔记要给 Amr 和未来的读者...
    • 第一种方法肯定是两者中更好的,因为它生成的输出字符串没有查找数组或数组函数。每次迭代都使用模条件来确定奇数/偶数。因为此方法已经使用连接来构建字符串,并且每个字母后面都有一个数字,所以最好完全省略条件,只连接字母后面的数字(正如我在答案中发布的那样)。如果您仍想确定奇数/偶数,按位 & 运算符是更好的调用 (php.net/manual/en/language.operators.arithmetic.php#120654)。
    • chr() 的使用值得注意,因为它避免了文字字符串声明,但是您提供的链接是一个完美的论据,说明为什么您不应该使用 ascii 引用函数调用(增加了开发人员错误,以及降低代码理解/可维护性)。否则,权衡归结为省略查找字符串声明进行迭代的chr()调用
    • 它的灵活性。
    • 恕我直言,问题主要是关于生成交替的字母数字字符串,长度应该是可选的,甚至更多的选项应该是可能的,比如控制每个域的频率和长度。
    【解决方案3】:

    您可以通过以下方式解决此问题:

    $alpha  = 'abcdefghijklmnopqrstuvwxyz';
    $number = '0123456789';
    
    $random = '';
    
    for ( $i = 0; $i < 6; ++$i ) {
        if ( $i % 2 ) {
            $random .= substr( $number, rand( 0, strlen( $number ) - 1 ), 1 );
        } else {
            $random .= substr( $alpha, rand( 0, strlen( $alpha ) - 1 ), 1 );
        }
    }
    

    $random 现在将包含一个六字符随机值,其中第一个、第三个和第五个字符来自$alpha,第二个、第四个和第六个字符来自$number

    【讨论】:

    • @mickmackusa 我假设您是抄袭我的答案的 cmets 的反对者。愿意解释反对意见吗?
    • 赞成使用模数。这允许有一个奇数长度的代码。
    • 我已经纠正了这个答案中的循环,但不会赞成它,因为这个任务不需要在每次迭代中调用模数条件 substr()strlen()
    【解决方案4】:

    你可以使用这个功能

    <?php
     public static function random_string($charsNo = 3, $NumbersNo = 3)
        {
            $character_set_array = array();
            $character_set_array[] = array('count' => $charsNo, 'characters' => 'abcdefghijklmnopqrstuvwxyzasdsawwfdgrzvyuyiuhjhjoppoi');
            $character_set_array[] = array('count' => $NumbersNo, 'characters' => '0123456789');
            $temp_array = array();
            foreach ($character_set_array as $character_set) {
                for ($i = 0; $i < $character_set['count']; $i++) {
                    $temp_array[] = $character_set['characters'][rand(0, strlen($character_set['characters']) - 1)];
                }
            }
            shuffle($temp_array);
            return implode('', $temp_array);
        }
    ?>
    

    【讨论】:

    • 因为它永远不会改变,所以在每次迭代时调用strlen() 并不是最佳实践。您最好在存储length 的多维数组中创建另一个元素。空数组声明是不必要的。此外,当将数组元素与空字符串粘合在一起时,可以省略第一个参数。看我的回答。
    • 我在之前的帖子中犯了与您相同的错误,即假设六个数字和字母需要打乱(以获得最大随机性)。但是,这不是 OP 所要求的。问题指出三个字母应该用数字隔开。
    • 你为什么在你的字符元素中加入“gobbledygook”,其中 26 个字母应该是?你给某些字母的概率增加了不受欢迎的权重。我不赞成这个答案,因为它没有提供OP 请求的输出。sandbox.onlinephpfunctions.com/code/…
    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 2015-11-09
    • 2014-07-05
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多