【问题标题】:Randomly generating a character?随机生成一个角色?
【发布时间】:2011-12-16 13:38:34
【问题描述】:

我在 PHP 中随机生成字符,使用:

for ($i = 0; $i < $length; $i++) {  
    $generatedCode .= chr(rand(97, 122));  
}

但我不希望字母“g”和“m”出现在随机生成的字符串中,我该怎么做?

【问题讨论】:

标签: php


【解决方案1】:
for ($i = 0; $i < $length; $i++) {  
    $generated = chr(rand(97, 122));
    if ($generated != "g" && $generated != "m") {
       $generatedCode .= $generated;  
    }
    else{
       $i--;
    }
}

【讨论】:

  • else $i-- 有点丑。为什么不只在正确的情况下递增,而不是每次递增,在不正确的情况下递减?
  • +1 @meagar - 为什么不while (in_array($generated = chr(rand(97, 122)),array('g','m'))) continue; $generatedCode .= $generated;
  • @DaveRandom 因为那更丑。您可以通过否定条件并使用空循环体而不是包含单个 continue; 语句的 while 循环来使其不那么难看,这是邪恶的。糟糕的while循环滥用:(
【解决方案2】:

执行循环,直到正确的值到位。

for ($i = 0; $i < $length;) {  
    $code = chr(rand(97, 122));  
    if ($code !== 'm' && $code !== 'g') // add the correct values here
    {
         $i++
         $generatedCode .= $code;
    }
}

【讨论】:

    【解决方案3】:
    for ($i = 0; $i < $length; $i++) {
        do {
            $randChar = chr(rand(97, 122));
        } while($randChar != 'g' && $randChar != 'm');
        $generatedCode .= $randChar;
    }
    

    【讨论】:

      【解决方案4】:
      $chars = array_diff(range('a', 'z'), array('g', 'm'));
      
      $generatedCode = '';
      for ($i = 0; $i < $length; $i++) {  
          $generatedCode .= $chars[array_rand($chars)];
      }
      

      【讨论】:

      • OP,循环直到你找到正确的字符是错误的。这就是你所需要的。
      • 我会用while (strlen($generatedCode) &lt; $length) { ... } 稍微清理一下,而不是引入计数变量,但这仍然是最好的解决方案。
      • @meagar 从计算上看,这稍微贵一些,所以......嗯。 :)
      • @deceze 你假设,但我怀疑。我在过去对这个假设进行了基准测试,如果它曾经是在 PHP 中,它不再是正确的。它不是用于微优化的语言。
      • @meagar 不多,但有点...codepad.org/kG59sxEM :) 这当然不值得讨论,无论哪种风格都可以。
      【解决方案5】:

      简单地说,过滤掉'g'和'm';

      <?php
      $length = 8;
      $generatedCode = '';
      while( strlen( $generatedCode ) < $length ) {  
          $random = chr(rand(97, 122));
          if( !in_array( $random, array( 'g', 'm' ) ) ) {
              $generatedCode .= $random;  
          }
      }
      
      echo $generatedCode;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-03
        • 1970-01-01
        • 2022-10-17
        • 1970-01-01
        • 2018-04-21
        • 2018-03-04
        • 2013-12-05
        • 1970-01-01
        相关资源
        最近更新 更多