Cómo puedo seleccionar un elemento aleatorio a partir de una matriz de caracteres en c ?

Por ejemplo:

char *array[19];

array[0] = "Hi";


array[1] = "Hello";

etc

Estoy buscando algo como array[rand], donde rand es el número entero aleatorio entre s y la longitud de la matriz(en este caso 20) como 1, 2, 3 , 19 etc.

  • Estás buscando después de rand()
  • trate de array[(int) (20 * rand())] donde 20 es la longitud de la matriz.
  • donde 20 es la longitud de la matriz, supongo?
  • tal vez char* array[20];
  • Crud, se olvidó de esto es el C – necesitan la escala de rand() por el máximo entero.
  • Así que, para ser claros, 20 * rand() no es correcto. Uso rand() % 20. Sin embargo, si su matriz es de 20 elementos de tiempo que necesita para reparar su declaración de variable! Usted está reservando sólo 19 de los elementos allí.
  • No, no uso % porque los resultados pueden ser no uniforme. La multiplicación de una U(0,1) valor 20 veces y el piso va a dar un entero de 0 a 19, es decir, 20 elementos, todos listos para partir de cero de la matriz de índices.
  • Su ejemplo de asignaciones de no trabajar; lo que estamos definiendo es un array de caracteres, no cadenas.
  • La matriz debe ser un puntero, lo consiguió.
  • Lo que @pjs es refereing a este asunto es de linux páginas man: «Las versiones de rand() y srand() en la Biblioteca de C de Linux uso el mismo generador de números aleatorios aleatorios(3) y srandom(3), de modo que los bits de orden inferior debe ser tan aleatorio como el de mayor orden de los bits. Sin embargo, en las personas de edad rand() de las implementaciones, y en las actuales implementaciones en sistemas diferentes, los bits de orden inferior son mucho menos aleatorio que el mayor orden de los bits. No utilice esta función en las aplicaciones que vayan a ser portátil y buena aleatoriedad es necesario. (Al azar(3) en su lugar.)»
  • Si hay una preocupación acerca de la calidad de la aleatoriedad rand() no es probablemente la mejor PRNG para usar en el primer lugar. El uso de rand(), pero dividiendo por RAND_MAX, luego de escala 20,0, a continuación, truncar, es una tierra de en medio entre la comodidad y la calidad que cumple con ninguno de los dos.
  • Mi anterior cita sugiere que si la plataforma proporciona random() puede ser mejor que rand() si usted está utilizando el % método (e igualmente goos como el uso (int)(U(0,1)*20).
  • rand()/RAND_MAX = 0, ya que ambos son enteros. Es mejor multiplicar por 20.0 primero y luego dividiendo por RAND_MAX.
  • Es cierto, mi fraseo fue descuidado. En cualquier caso, mi punto era que si te importa lo suficiente acerca de la calidad para hacer esto, usted probablemente querrá un mejor uso de la PRNG (como random si está disponible en su plataforma).
  • No, los pjs se refiere al hecho de que rand() % 20 no es exactamente el modelo de una distribución uniforme si RAND_MAX no es uno menos que un múltiplo de 20. Algunos valores son más probables que otros. Comparar con un laminado de 6 caras morir y tomar el resultado del modulo 5: resultados posibles son 1,2,3,4,0,1. 1 es el doble de probabilidades que los otros resultados.
  • Si ese es el sesgo que se refiere, luego de escala rand() a U(0,1), a continuación, escalando por 20 no va a ayudar – Por el principio del palomar se obtiene exactamente la misma cantidad de sesgo. El sesgo debido a esto es < (20/RAND_MAX) y dado que la norma garantiza RAND_MAX > 32767 usted está buscando en un máximo sesgo de menos de 0.06%. ( 32760 valores ocurrir 1638 veces, y 7 de los valores de producirse 1639 veces). Si este sesgo es demasiado grande para que usted (y su RAND_MAX=32760) que usted necesita, ya sea para rechazar los 7 valores (rechazo de muestreo – que es imparcial), o combinar más de una llamada a la función rand() para obtener más «random» bits.

5 Comentarios

  1. 2

    Para empezar las cosas, ya que tiene una matriz de cadenas, no de los personajes, tiene que declarar como char* array[19];

    A continuación, puede declarar los siguientes (siempre útil) macro

    #define ARR_SIZE(arr) ( sizeof((arr)) /sizeof((arr[0])) )

    Último, usted puede elegir arr[rand() % ARR_SIZE(arr)] (teniendo en cuenta que la realización de % en rand() es no de la manera adecuada para obtener un número aleatorio dentro de un rango.

    • En la mayoría de los sistemas, obtendrá la misma respuesta cada vez que se ejecuta el programa, a menos que la semilla del generador de números aleatorios con un valor diferente cada vez. Echa un vistazo srand(), pero ser conscientes de que conseguir una decente de la semilla es en realidad bastante difícil. Y el drand48() de la familia de PRNG funciones es muy útil también, aunque todavía tienen la siembra problema.
    • Que es un comentario correcto, sin embargo, me estaba refiriendo a la cuestión de la selección de un número aleatorio dentro de un rango de números de tal manera como para seguir siendo distribuida de manera uniforme.
  2. 1
    int n = rand()%20;
    printf("%s\n", array[n]);
    • % 20 puede producir la no uniformidad de los resultados.
  3. 1

    Usted puede tratar de la matriz[rand() % ARRAY_LEN] pero usted va a obtener un solo char y no un char*

    y cuando usted está haciendo matriz[0] = «Hola»; no es correcto puesto que usted está asignando a una sola char un char*

    o convertir su char array[20] en un char *array[20] y usted puede asignar una cadena de caracteres

    • Estás en lo correcto. Me estaba poniendo seg fallo antes de modificar la matriz en un puntero. (Upvote, gracias)
  4. 0

    Lo que proponemos es la mejor solución que hay, elegir un índice aleatorio y, a continuación, utilizar el elemento en este índice. Si tu pregunta es cómo conseguir un entero aleatorio, utilizar la función incorporada rand().

  5. 0

    Esto se puede hacer utilizando rand en el c de la biblioteca stdlib.h

    Usted puede obtener un número aleatorio como este:

    char random_elem = array[rand()%20];

    y usted puede imprimir como este:

    printf(«%d»,matriz[rand()%20]);

    • Muchas gracias por tu aporte, pero esta cuestión ya tiene par de buena calidad de las respuestas y su respuesta no aporta nada nuevo. Cómo trata de centrarse en algunos sin respuesta C preguntas?

Dejar respuesta

Please enter your comment!
Please enter your name here