【问题标题】:How can I create an algorithm for generating random strings?如何创建生成随机字符串的算法?
【发布时间】:2009-08-21 17:12:49
【问题描述】:

我想生成随机字符串,例如:

sssder
tvmwww
66rfdd
123123
oo007oo
1234
2020
1111
rrrr
r8r8r
uiuiu
wewewe
fefefe
abced
xyz..

具体来说,我想要一个长度为 5 到 8 个字符的字符串,易于记忆。这可能吗?

【问题讨论】:

  • 定义“花式”...
  • 你对花式的定义是什么?您想在哪里使用这些字符串?
  • 定义花式。你的意思是随机的小写字符和数字吗?
  • 你想让字符和长度完全随机吗?
  • 您的问题被否决的原因是它没有明确定义。就好像您发布了“我如何对计算机进行编程以生成漂亮的图片?”没有给出计算机可以理解的“漂亮”的定义。

标签: php algorithm


【解决方案1】:

你要找的是助记字符串生成器,这里是函数:

function Mnemonic($letters = 6)
{
    $result = null;
    $charset = array
    (
        0 => array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'),
        1 => array('a', 'e', 'i', 'o', 'u'),
    );

    for ($i = 0; $i < $letters; $i++)
    {
        $result .= $charset[$i % 2][array_rand($charset[$i % 2])];
    }

    return $result;
}

更新为允许字符串末尾有数字:

function Mnemonic($letters = 6, $digits = 2)
{
    $result = null;
    $charset = array
    (
        0 => array('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'),
        1 => array('a', 'e', 'i', 'o', 'u'),
    );

    for ($i = 0; $i < $letters; $i++)
    {
        $result .= $charset[$i % 2][array_rand($charset[$i % 2])];
    }

    for ($i = 0; $i < $digits; $i++)
    {
        $result .= mt_rand(0, 9);
    }

    return $result;
}

【讨论】:

    【解决方案2】:

    Here 是一个相当复杂的脚本的来源,该脚本遍历BNF-like definition of a string 并通过随机选择可能性来生成匹配字符串。 These pages 包含一些示例定义。也许这可能有用。

    【讨论】:

      【解决方案3】:

      请参阅this post 了解一个简短的 PHP 函数,用于生成指定长度的随机可用键盘字符串(因为这看起来像一个密码生成器)。这是从该帖子中复制的函数。

      function rand_char($length) {
        $random = '';
        for ($i = 0; $i < $length; $i++) {
          $random .= chr(mt_rand(33, 126));
        }
        return $random;
      }
      

      【讨论】:

      • 这就是我要发布的内容。
      【解决方案4】:

      这取决于你想从字符串中得到什么。从您提供的示例中,您似乎想要一个两步的事情;例如一个生成三字符随机字符串的函数,然后将每个字符加倍;或重复字符串;或重复第一个字符三次,第二个字符重复两次,第三个字符重复一次。

      基本上,您可能想要做的是创建一个“池”,例如使用随机选择的方法生成的合适的短字符串(所有数字、随机开始的序号、连续字母、从字典...),然后是一个根据某些原则对字符串进行膨胀的函数。

      【讨论】:

        【解决方案5】:

        试试这个:PHP 中的随机字母数字字符串生成器脚本

        http://www.i-fubar.com/random-string-generator.php

        【讨论】:

        • 那是一段相当丑陋和低效的代码,我敢打赌我可以在 5 行或更少的时间内归档完全相同的结果。
        【解决方案6】:

        如果这是用于随机 ID 或类似的东西,我建议

        uniqid(...)

        http://us3.php.net/manual/en/function.uniqid.php>http://us3.php.net/manual/en/function.uniqid.php

        【讨论】:

          【解决方案7】:

          使用遗传算法。设置你的适应度函数来决定你的字符串有多“随机”(即两个辅音相邻吗?嗯,这不如辅音旁边的符号或数字......但是字母表中的辅音相距多远?是他们是一样的情况吗?)让它运行几天,你一定会找到你所希望的最花哨、最随机的 5-8 个字符串。

          【讨论】:

          • 我忽略了您对“易于记忆”的担忧。您的健身功能还可以监控键盘上字母的接近度、与用户语言中单词的语音相似度、小键盘上的有趣模式等。
          【解决方案8】:

          我将从一些关于“容易记住”的个人猜想开始:

          如果有一个或多个模式,一个字符串通常很容易记住,例如:

          • 它有重复的字符
          • 它具有字符序列(a-b-c、1-2-3)
          • 它“听起来”像一个单词(模仿真实单词的音素序列:“diskow”)

          编写一个程序,对根据规则生成的随机序列进行“评分”,并选出得分最高的人。这就像一个蒙特卡洛方法来找到你想要的输出。如果你不喜欢输出,你可以调整你的评分方法。

          当然,还有其他“好记”的字符串不符合上述条件:

          • 如果它具有个人意义(你的生日)
          • 如果重复很多...(每个人都知道 pi = 3.1415,因为我们受过训练知道它)虽然,我认为 PI 更好地描述为易于回忆,而不是易于记忆(存储记忆中)。

          【讨论】:

            【解决方案9】:

            一个简单的方法可能是:

            1) 初始化一个空字符串
            2)生成[0,25]之间的随机数
            3) 将 97 添加到该数字
            4) 为那个数字生成一个字符
            5) 将字符附加到现有字符串
            * 运行步骤 1-5 的次数,等于字符串的长度。

            说我想要长度为 6-10 的字符串。 对于您需要运行这段代码的每个字符串

            i = rand (6,10)
            str = "";
            while(i--)
            {
               num = rand (97,97+25);
               c = chr(num);
               str = str.c;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-09
              • 2017-08-01
              相关资源
              最近更新 更多