Me gustaría crear una cadena aleatoria, que consta de caracteres alfanuméricos. Quiero poder especificar la longitud de la cadena.
¿Cómo hago esto en C ++?
La respuesta de Mehrdad Afshari haría el truco, pero lo encontré demasiado detallado para esta simple tarea. Las tablas de consulta a veces pueden hacer maravillas:
void gen_random(char *s, const int len) {
static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
for (int i = 0; i < len; ++i) {
s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
}
s[len] = 0;
}
s[len] = 0
es incorrecta. Si ses
trata de una cadena C (terminada en NULL), la firma del método no tendría que tener ellen
parámetro. Imo, si está pasando la longitud como argumento, está asumiendo que la matriz no es una cadena C. Por lo tanto, si no está pasando una cadena C a la función, la líneas[len] = 0
podría romper cosas, ya que la matriz pasaría de 0 a len-1. E incluso si está pasando una cadena C a la función, la líneas[len] = 0
sería redundante.Aquí está mi adaptación de la respuesta de Ates Goral usando C ++ 11. He agregado el lambda aquí, pero el principio es que puedes pasarlo y así controlar qué caracteres contiene tu cadena:
Aquí hay un ejemplo de pasar una lambda a la función de cadena aleatoria: http://ideone.com/Ya8EKf
¿Por qué usarías C ++ 11 ?
Por ejemplo:
Salida de muestra.
fuente
rand()
en su primer fragmento de código?rand()
. Ni siquiera es uniforme por elMi solución 2p:
fuente
default_random_engine
lugar demt19937
? El código se vería más genérico.std::default_random_engine
no es algo que me guste recomendar, ya que el estándar no garantiza su calidad, eficiencia o repetibilidad entre implementaciones.sizeof
, cambie elauto&
astd::string
, que le dastd::string::length
std::string
probablemente sea más lento porque contiene un puntero interno a sus datos. Eso significaría una indirección adicional que una matriz estática no requiere. Ademássizeof
, nunca puede ser más lento questd::string::size
porque es una constante de tiempo de compilación.std::size
, no apareció hastaC++17
y todavía hay mucha gente que solo codifica,C++11/14
así que lo dejaré como está por ahora.fuente
Acabo de probar esto, funciona bien y no requiere una tabla de búsqueda. rand_alnum () elimina las alfanuméricas, pero debido a que selecciona 62 de los 256 caracteres posibles, no es gran cosa.
fuente
En lugar de realizar un bucle manual, prefiera usar el algoritmo C ++ apropiado , en este caso
std::generate_n
, con un generador de números aleatorios adecuado :Esto está cerca de algo que yo llamaría la solución "canónica" para este problema.
Desafortunadamente, sembrar correctamente un generador genérico de números aleatorios C ++ (por ejemplo, MT19937) es realmente difícil . Por lo tanto, el código anterior utiliza una plantilla de función auxiliar
random_generator
:Esto es complejo y relativamente ineficiente. Afortunadamente, se usa para inicializar una
thread_local
variable y, por lo tanto, solo se invoca una vez por subproceso.Finalmente, los elementos necesarios para lo anterior son:
El código anterior utiliza la deducción de argumentos de plantilla de clase y, por lo tanto, requiere C ++ 17. Se puede adaptar trivialmente para versiones anteriores agregando los argumentos de plantilla requeridos.
fuente
std::size_t
destd::uniform_int_distribution
? No puedo ver ninguna otra CTADrng
como un parámetro predeterminado, con algo comotemplate <typename T = std::mt19937> inline thread_local T default_rng = get_random_generator<T>();
std::uniform_int_distribution<>
, lo que sería seguro, pero podría advertir sobre la conversión firmada -> sin firmar.Espero que esto ayude a alguien.
Probado en https://www.codechef.com/ide con C ++ 4.9.2
Output: random_str : DNAT1LAmbJYO0GvVo4LGqYpNcyK3eZ6t0IN3dYpHtRfwheSYipoZOf04gK7OwFIwXg2BHsSBMB84rceaTTCtBC0uZ8JWPdVxKXBd
fuente
RandomString(100)
! ;-)std::srand()
que solo se debe llamar una vez al comienzo del programa (preferiblemente lo primeromain()
). El código, tal como está, generará muchas cadenas "aleatorias" idénticas si se llama en un bucle cerrado.Aquí hay una frase divertida. Necesita ASCII.
fuente
fuente
std::string
lugar destd::string::value_type[]
Algo aún más simple y más básico en caso de que esté contento de que su cadena contenga caracteres imprimibles:
fuente
Cadena aleatoria, cada archivo de ejecución = cadena diferente
fuente
std::generate_n
asumirá quecustom_string
tiene longitudLENGTH_NAME
, pero no lo hace.Ejemplo de uso de Qt :)
fuente
¡Hagamos que el azar sea conveniente nuevamente!
Creé una buena solución de solo encabezado C ++ 11. Puede agregar fácilmente un archivo de encabezado a su proyecto y luego agregar sus pruebas o usar cadenas aleatorias para otros fines.
Esa es una descripción rápida, pero puede seguir el enlace para verificar el código completo. La parte principal de la solución está en la clase Randomer:
Randomer
encapsula todas las cosas al azar y puede agregarle su propia funcionalidad fácilmente. Después de que tenemosRandomer
, es muy fácil generar cadenas:Escriba sus sugerencias de mejora a continuación. https://gist.github.com/VjGusev/e6da2cb4d4b0b531c1d009cd1f8904ad
fuente
Otra adaptación más porque ninguna de las respuestas sería suficiente para mis necesidades. En primer lugar, si se usa rand () para generar números aleatorios, obtendrá la misma salida en cada ejecución. La semilla para el generador de números aleatorios tiene que ser algún tipo de aleatorio. Con C ++ 11 puede incluir una biblioteca "aleatoria" y puede inicializar la semilla con random_device y mt19937. Esta semilla será suministrada por el sistema operativo y será lo suficientemente aleatoria para nosotros (por ejemplo: reloj). Puede dar un rango límites están incluidos [0,25] en mi caso. Y por último, pero no menos importante, solo necesitaba una cadena aleatoria de letras minúsculas, así que utilicé la adición de caracteres. Con un enfoque de grupo de personajes no funcionó para mí.
fuente
fuente
Tenga cuidado al llamar a la función
(adaptado de @Ates Goral ) dará como resultado la misma secuencia de caracteres cada vez. Utilizar
antes de llamar a la función, aunque la función rand () siempre se siembra con 1 @kjfletch .
Por ejemplo:
fuente
fuente
fuente