Comment puis-je créer un hasard alpha-numérique chaîne de caractères en C++?
J'aimerais créer une chaîne de caractères aléatoires, composé de caractères alpha-numériques. Je veux être capable de spécifier la longueur de la chaîne.
Comment puis-je le faire en C++?
Vous devez vous connecter pour publier un commentaire.
Mehrdad Afshari de réponse ferait l'affaire, mais je l'ai trouvé un peu trop verbeux pour cette simple tâche. Les tables de recherche peut parfois faire des merveilles:
s[len] = 0
est incorrect. Sis
est une chaîne C (NULL) puis la signature de la méthode n'aura pas lelen
paramètre en elle. Imo, si vous êtes de passage à la longueur comme argument, vous êtes en supposant que le tableau n'est pas une chaîne C. Ainsi, si vous n'êtes pas en passant une chaîne C de la fonction, la lignes[len] = 0
pourrait casser des choses, puisque la matrice de 0 à len-1. Et même si vous passez une chaîne C de la fonction de la lignes[len] = 0
serait redondante.char buffer[16];
vous fait appelgen_random(buffer, sizeof(buffer) - 1);
en accordant une attention particulière à se souvenir de la- 1
size_t len
etsize_t i
? 🙂rand()
?!?!?! en 2018 !??!Voici mon adaptation de l'Ates Goral de la réponse à l'aide de C++11. J'ai ajouté le lambda ici, mais le principe est que vous pourriez passer dans et ainsi contrôler ce que les caractères de votre chaîne contient:
Voici un exemple de passage dans un lambda de la chaîne aléatoire de fonction: http://ideone.com/Ya8EKf
Pourquoi voudriez-vous utiliser C++11?
Par exemple:
Exemple de sortie.
rand()
dans votre premier extrait de code?rand()
plus. Il n'est même pas uniforme pour pleurer à haute voix...Mon 2p solution:
default_random_engine
au lieu demt19937
? Le code ressemblerait plus générique.std::default_random_engine
n'est pas quelque chose que je sentir bien à propos de recommander que la norme ne donne aucune garantie quant à sa qualité, l'efficacité ou la répétabilité entre les implémentations.sizeof
, changer laauto&
àstd::string
, qui vous donnestd::string::length
std::string
était susceptible d'être plus lente, car il contient un pointeur interne de ses données. Que signifierait une indirection supplémentaire qu'un tableau statique n'a pas besoin. Aussisizeof
ne peut jamais être plus lent questd::string::size
parce que c'est un moment de la compilation constante.Je viens de testé, il fonctionne doux et ne nécessite pas une table de recherche. rand_alnum() tri des forces caractères alphanumériques, mais parce qu'il sélectionne 62 possible de 256 caractères, il n'est pas une grosse affaire.
J'ai tendance à toujours utiliser les structurée C++ moyens pour ce genre d'initialisation. Remarquez que, fondamentalement, ce n'est pas différent Altan de la solution. Pour un programmeur C++, c'est juste exprime l'intention d'un peu mieux et peut-être plus facilement portable vers d'autres types de données. Dans ce cas, la fonction C++
generate_n
exprime exactement ce que vous voulez:Par le chemin, lire Julienne de l'essai de sur les raisons de cette calcul de l'indice est préféré par rapport à des méthodes plus simples (comme prendre le module).
J'espère que cela aide quelqu'un.
Testé à https://www.codechef.com/ide avec C++ 4.9.2
Output:
random_str : DNAT1LAmbJYO0GvVo4LGqYpNcyK3eZ6t0IN3dYpHtRfwheSYipoZOf04gK7OwFIwXg2BHsSBMB84rceaTTCtBC0uZ8JWPdVxKXBd
RandomString(100)
! 😉std::srand()
ne devrait vraiment être appelé une fois au début du programme (de préférence, la première chosemain()
). Le code, comme c'est, va générer beaucoup de identique "aléatoire" des chaînes si elle est appelée dans une boucle.Voici un drôle one-liner. Les besoins en ASCII.
Quelque chose d'encore plus simple et la plus basique dans le cas où vous êtes heureux de votre chaîne pour contenir tous les caractères imprimables:
Chaîne aléatoire, chaque fichier = chaîne de caractère
std::generate_n
assumera lacustom_string
a longueurLENGTH_NAME
, mais il ne le fait pas.Exemple pour utiliser Qt:)
std::string
au lieu destd::string::value_type[]
Nous allons faire des pratiques de nouveau!
J'ai fait une belle C++11 en-tête seule solution.
Vous pouvez facilement ajouter un fichier d'en-tête à votre projet, puis ajoutez vos tests ou de l'utilisation des chaînes aléatoires à autre.
C'est une description rapide, mais vous pouvez suivre le lien pour voir le code complet. La partie principale de la solution est dans la classe Randomer:
Randomer
incapsulates tous des trucs aléatoires et vous pouvez ajouter vos propres fonctionnalités facilement. Après nous avoirRandomer
, il est très facile de générer des chaînes:Écrire vos suggestions d'amélioration ci-dessous.
https://gist.github.com/VjGusev/e6da2cb4d4b0b531c1d009cd1f8904ad
Être ware lors de l'appel de la fonction
(adapté de @Ates Goral) il en résulte la même séquence de caractères à chaque fois. Utilisation
avant l'appel de la fonction, bien que la fonction rand() est toujours ensemencés avec 1 @kjfletch.
Par Exemple: