如何创建用于生成随机字符串的算法?

时间:2009-08-21 17:12:50

标签: php algorithm

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

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

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

9 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

您正在寻找的是一个助记符字符串生成器,这是函数:

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 :(得分:3)

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

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

答案 3 :(得分:2)

这取决于你想要的字符串。从你提供的例子来看,似乎你想要一个两步的东西;例如一个生成三个字符随机字符串的函数,然后将每个字符加倍;或重复串;或者重复第一个字符三次,第二次重复两次,第三次重复一次。

基本上你可能想要做的是创建一个“池”,比如一个用随机选择的方法生成的合适的短字符串(所有数字,随机开始的连续数字,连续字母,随机选择的字部分)字典...)然后是一个根据某种原则使字符串膨胀的函数。

答案 4 :(得分:2)

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

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

答案 5 :(得分:2)

如果这是随机id或类似的东西我推荐

uniqid(...)

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

答案 6 :(得分:2)

使用遗传算法。设置你的健身功能来决定你的弦是多么“随机”(即两个辅音是相邻的?那么它不如辅音旁边的符号或数字那么好......但是字母表中的辅音有多远?他们是同样的情况?)让它运行几天,你将保证找到你所希望的最高,最随机的5-8个字符串。

答案 7 :(得分:2)

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

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

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

编写一个程序,对根据规则生成的随机序列进行“评分”,然后选出最佳得分者。这就像蒙特卡罗方法,用于查找所需的输出。如果您不喜欢输出,可以调整评分方法。

当然,还有其他“容易记住”的字符串不符合上述要求:

  • 如果它具有个人意义(您的生日)
  • 如果它被重复很多......(每个人都知道pi = 3.1415,因为我们已经接受过培训才能知道它)虽然,我认为PI更好地描述为容易回忆,而不是容易记住(存储在记忆中)。

答案 8 :(得分:1)

一种简单的方法可能是:

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;
}