Как я могу создать алгоритм для генерации случайных строк? - PullRequest
2 голосов
/ 21 августа 2009

Я хочу генерировать случайные строки, такие как:

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

В частности, я хочу строку длиной от 5 до 8 символов, которую легко запомнить . Это возможно?

Ответы [ 9 ]

5 голосов
/ 22 августа 2009

То, что вы ищете, это генератор мнемонических строк, вот функция:

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;
}
5 голосов
/ 21 августа 2009

Здесь - источник довольно сложного сценария, который использует BNF-подобное определение строки и генерирует соответствующую строку путем случайного выбора возможностей. Эти страницы содержат некоторые примеры определений. Возможно, это может быть полезным.

3 голосов
/ 21 августа 2009

См. в этом посте для краткой функции PHP для генерации произвольно используемой строки символов клавиатуры заданной длины (так как это выглядит как генератор паролей) Вот функция, скопированная из этого поста.

function rand_char($length) {
  $random = '';
  for ($i = 0; $i < $length; $i++) {
    $random .= chr(mt_rand(33, 126));
  }
  return $random;
}
2 голосов
/ 21 августа 2009

Я начну с нескольких личных предположений о «простоте запоминания»:

Строка обычно легко запомнить, если есть один или несколько шаблонов, например:

  • имеет повторения символов
  • имеет последовательности символов (a-b-c, 1-2-3)
  • это «звучит» как слово (последовательности фонем, которые имитируют реальные слова: «диско»)

Напишите программу, которая "оценивает" случайные последовательности, сгенерированные на основе правил, и возьмите лучших бомбардиров. Это как метод Монте-Карло для нахождения желаемого результата. Вы можете настроить метод подсчета очков, если вам не нравится вывод.

Конечно, есть и другие «легко запоминающиеся» строки, которые не соответствуют вышеприведенному:

  • если это имеет личное значение (ваш день рождения)
  • если оно повторяется много ... (все знают, что пи = 3,1415, потому что мы обучены это знать). Хотя, я бы сказал, что ПИ лучше описать как легко запоминаемый, а не легко запоминающийся в памяти).
2 голосов
/ 21 августа 2009

Используйте генетический алгоритм. Настройте свою фитнес-функцию, чтобы решить, насколько «случайна» ваша строка (то есть, являются ли две согласные соседними? Ну, это не так хорошо, как символ или число рядом с согласной ... но как далеко друг от друга согласные в алфавите? Это один и тот же случай?) Дайте ему поработать пару дней, и вы гарантированно найдете самую необычную, случайную строку из 5-8 символов, на которую вы когда-либо рассчитывали.

2 голосов
/ 21 августа 2009

Если это для случайных идентификаторов или что-то подобное, я рекомендую

uniqid (...)

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

2 голосов
/ 21 августа 2009

Попробуйте: скрипт генератора случайных буквенно-цифровых строк в PHP

http://www.i -fubar.com / случайная строка-generator.php

2 голосов
/ 21 августа 2009

Это зависит от того, что вы хотите от строк. Из приведенных вами примеров кажется, что вы хотите сделать два шага; например функция, которая генерирует случайную строку из трех символов, затем удваивает каждый символ; или повторяет строку; или повторяет первый символ три раза, второй два раза и третий, но один раз.

По сути, вы, вероятно, захотите сделать «пул», скажем, подходящую короткую строку, которая генерируется случайным образом выбранным методом (все числа, последовательные числа со случайным началом, последовательные буквы, части слова, выбранные случайным образом словарь ...), а затем функция, которая надувает строку в соответствии с некоторым принципом.

1 голос
/ 24 марта 2012

Простой подход может быть:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...