2009-08-21 3 views
1

Je veux générer des chaînes aléatoires comme:Comment puis-je créer un algorithme pour générer des chaînes aléatoires?

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

Plus précisément, je veux une chaîne avec une longueur de 5 à 8 caractères qui est facile de se rappeler. Est-ce possible?

+14

Define « fantaisie » ... – sth

+1

Quelle est votre définition de fantaisie? Où voulez-vous utiliser ces chaînes? – Raminder

+1

Définir fantaisie. Voulez-vous dire des caractères minuscules et des chiffres aléatoires? – cherouvim

Répondre

4

Qu'est-ce que vous cherchez est un générateur de chaîne mnémotechnique, voici la fonction:

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

Mise à jour pour permettre des chiffres à la fin de la chaîne:

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

oui C'est exactement ce dont j'avais besoin, merci eyze :) – coderex

1

Cela dépend de ce que vous voulez des chaînes. D'après les exemples que vous avez fournis, il semble que vous vouliez une chose en deux étapes; par exemple. une fonction qui génère une chaîne aléatoire de trois caractères, puis double chaque caractère; ou répète la chaîne; ou répète le premier caractère trois fois, le deuxième deux fois, et le troisième mais une fois. Fondamentalement ce que vous voulez probablement faire est de faire un "pool", disons une courte chaîne appropriée qui est générée avec une méthode choisie au hasard (tous les nombres, nombres séquentiels avec départ aléatoire, lettres séquentielles, parties de mots choisies au hasard un dictionnaire ...) puis une fonction qui gonfle la chaîne selon un principe.

1

Essayez ceci: Random Alphanumeric chaîne Générateur de script en PHP

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

+1

C'est un morceau de code plutôt moche et inefficace, je parie que je pourrais archiver exactement le même résultat en 5 lignes ou moins. –

+0

+1 eyze, c'est en effet du code maléfique. –

4

Here est s ource pour un script plutôt compliqué qui marche un BNF-like definition of a string et génère une chaîne correspondante en sélectionnant au hasard des possibilités. These pages contiennent des exemples de définitions. Peut-être que cela peut être utile.

1

Utiliser un algorithme génétique. Configurez votre fonction de fitness pour décider si votre chaîne est "aléatoire" (c'est-à-dire si deux consonnes sont adjacentes?) Ce n'est pas aussi bon qu'un symbole ou un nombre à côté d'une consonne ... mais à quelle distance sont les consonnes dans l'alphabet? ils le même cas?) Laissez-le courir pendant quelques jours, et vous serez assuré de trouver la chaîne la plus chic et la plus aléatoire de 5-8 caractères que vous auriez jamais espérée.

+0

J'ai négligé de répondre à votre souci de "facile à retenir".Votre fonction de remise en forme pourrait également surveiller la proximité des lettres sur le clavier, la similitude phonétique avec les mots dans la langue de l'utilisateur, les motifs amusants sur le pavé numérique, etc. – snicker

2

Voir this post pour une fonction PHP courte pour générer une chaîne de caractères de clavier aléatoire utilisable d'une longueur spécifiée (comme cela ressemble à un générateur de mot de passe). Voici la fonction copiée à partir de ce message.

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

Voici ce que je vais publier. –

1

Je vais commencer par quelques conjectures personnelles sur « facile à retenir »:

Une chaîne est généralement facile de se rappeler s'il y a un ou plusieurs motifs, tels que:

  • il a des répétitions de caractères
  • il a des séquences de caractères (abc, 1-2-3)
  • il « sonne » comme un mot (séquences de phonèmes qui imitent les vrais mots: « Diskow ")

Ecrivez un programme qui" marque "les séquences aléatoires générées en fonction des règles, et prenez les meilleurs scores. C'est comme une méthode Monte Carlo pour trouver la sortie que vous voulez.Vous pouvez ajuster votre méthode de notation si vous n'aimez pas la sortie.

Bien sûr, il y a d'autres « facile à retenir » chaînes qui ne correspondent pas au-dessus:

  • si elle a une signification personnelle (votre anniversaire)
  • si elle est répétée BEAUCOUP .. (tout le monde sait pi = 3.1415 parce que nous sommes formés pour le savoir) Bien que, je dirais que PI est mieux décrit comme facile à se rappeler, plutôt que facile à mémoriser (stocker en mémoire).
0

Une approche simple peut être:

1) initialiser une chaîne vide
2) générer un nombre aléatoire compris entre [0,25]
3) Ajouter 97 à ce nombre
4) générer un caractère pour ce numéro
5) ajouter le caractère à la chaîne existante
* run étapes 1- 5 pour le nombre de fois, égal à la longueur de la chaîne. Disons que je veux des chaînes de 6-10. pour chaque chaîne que vous devez exécuter ce morceau de code

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