Para generar una matriz de números aleatorios en un rango dado en “C”

Quiero generar una matriz de números aleatorios, por ejemplo, si el rango es [0,10], entonces la salida deseada será 2 3 5 6 4 7 8 9 0 1 (no repetitiva)

El problema al que me enfrento con la función rand () es que a veces obtengo algunos números repetidos, valores discretos en ese rango y un orden diferente cada vez que invoco

Ps: Pasé por algunos de los subprocesos. Generar un doble aleatorio en un rango. Generar números aleatorios uniformemente en un rango completo aquí y no podría encontrar una mina similar, hay una diferencia sutil. especialmente este último está bastante cerca

Parece más un problema de barajar el de la aleatorización.

Un buen comienzo es el shuffle de Fisher-Yates que comienza con la matriz ordenada de elementos y genera una permutación aleatoria:

int size = 10; int *elements = malloc(sizeof(int)*size); // inizialize for (int i = 0; i < size; ++i) elements[i] = i; for (int i = size - 1; i > 0; --i) { // generate random index int w = rand()%i; // swap items int t = elements[i]; elements[i] = elements[w]; elements[w] = t; } 

Tendrá un tiempo más fácil si comienza con una matriz con los números enteros 0-9 (o cualquiera que sea su rango) y luego la mezcla aleatoriamente. Hay un ejemplo de cómo hacer la barajada aquí .

Básicamente, querría aleatorizar una matriz [0, 1, …, 9]. Aquí hay un ejemplo de C ++, debería ser fácil de transformar a C:

Este código solo para números enteros, pero espero que sea suficiente. Se utiliza el GCC para la comstackción y solo la biblioteca estándar de C. Lea los comentarios para más detalles. Sus resultados tendrán valores diferentes, pero ya que serán aleatorios.

 #include  #include  #include  #include  // http://man7.org/linux/man-pages/man3/errno.3.html #define ERROR_MIN_MORE_MAX_VALUE "Min value is more max value, returned 0" /* Returns a random integer in between min (inclusive) and max (inclusive) Returns 0 if min > max and to write a error message. */ static int random_integer(const int min, const int max) { if (max == min) return min; else if (min < max) return rand() % (max - min + 1) + min; // return 0 if min > max errno = EINVAL; perror(ERROR_MIN_MORE_MAX_VALUE); return 0; } /* Fills an array with random integer values in a range */ static int random_int_array(int array[], const size_t length, const int min, const int max){ for (int i = 0; i < length; ++i) { array[i] = random_integer(min, max); } return 0; } /* Print an array of integer items */ void print_int_array(int array[], size_t length) { char ending_charapter[] = ", "; putchar('['); for (size_t i = 0; i < length; ++i) { printf("%d", array[i]); if (i < length - 1) { printf("%s", ending_charapter); } } puts("]"); } int main (const int argc, const char *argv[]) { // for get a random integer number from a system, to pass a current time to the function srand srand(time(NULL)); int arr[10]; printf("\tAn array with random values from 0 to 100\n"); random_int_array(arr, 10, 0, 100); print_int_array(arr, 10); printf("\n\tAn array with random values from -100 to 0\n"); random_int_array(arr, 10, -100, 0); print_int_array(arr, 10); printf("\n\tAn array with random values from -100 to 100\n"); random_int_array(arr, 10, -100, 100); print_int_array(arr, 10); return 0; } 

Resultado

  An array with random values from 0 to 100 [86, 25, 98, 61, 42, 26, 87, 56, 86, 79] An array with random values from -100 to 0 [-33, -92, -57, -92, -6, -15, -61, -32, -75, -85] An array with random values from -100 to 100 [-15, -99, 54, 42, -74, 46, 6, -44, 86, -47] 

Entorno de prueba

 $ lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.6 (jessie) Release: 8.6 Codename: jessie $ uname -a Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux $ gcc --version gcc (Debian 4.9.2-10) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

+ Pon todos tus números en la matriz de resultados
+ desde N hasta 2
+ —- mezclar N elementos
+ matriz de retorno

Ejemplo

 fillarray(arr, 10); for (n = 10; n > 1; n++) shufflearray(arr, n); /* done */ 


Editar — gracias downvoter! Ni siquiera me di cuenta de que estaba haciendo mucho trabajo allí

  • Pon todos tus números en la matriz de resultados
  • de N a 2
  • —- intercambiar el elemento N con un elemento aleatorio de 1 a N
  • matriz de retorno