Aleatorizar 4 números diferentes

Estoy intentando aleatorizar 4 números diferentes en C y probar el siguiente código:

{ int num1 = 0, num2 = 0, num3 = 0, num4 = 0; int i = 0; while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num3 == num2) { num1 = rand() % 7; num2 = rand() % 7; num3 = rand() % 7; num4 = rand() % 7; } printf("%d %d %d %d\n", num1, num2, num3, num4); } 

El código debe verificar si los números no son iguales y si son iguales, debe generar nuevos números hasta que sean distintos. Pero por alguna razón, no funciona bien e incluso los números correctos los pone como incorrectos y se convierten en un bucle sin fin.

¿Qué me estoy perdiendo?

Este código elegirá 4 números diferentes en el rango 0 .. 6, funciona creando una matriz de números disponibles, ya que cada uno seleccionado se elimina de la lista.

 #include  #include  #include  #define RANGE 7 // how many different numbers #define PICK 4 // how many to pick int main(void) { int pool[RANGE]; int size, n, i; for (size=0; size 

Prueba asi

 void get_random_values(int *values) { int source[] = {0, 1, 2, 3, 4, 5, 6}; for (int i = 0 ; i < 7 ; ++i) { int saved; int j = rand() % 7; int k = rand() % 7; saved = source[j]; source[j] = source[k]; source[k] = saved; } values[0] = source[0]; values[1] = source[1]; values[2] = source[2]; values[3] = source[3]; } int main(void) { int values[4]; srand(time(NULL)); get_random_values(values); for (int i = 0 ; i < 4 ; ++i) fprintf(stderr, "%d ", values[i]); fprintf(stderr, "\n"); return 0; } 

No te olvides de configurar la srand() aleatoria srand() al inicio del progtwig o siempre obtendrás la misma secuencia.

Para obtener una secuencia aleatoria e imparcial :

 #include  #include  #define N 7 int main(int argc, char **argv) { // seed random number generator with first argument for easier testing if (argc > 1) { srand(atoi(argv[1])); } int array[N] = {0,1,2,3,4,5,6}; // Fisher–Yates shuffle: // https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm for (unsigned i = 0; i < N - 1; ++i) { unsigned modulo = N - i; // unbiased rand() % modulo: // https://stackoverflow.com/a/10989061/416224 unsigned j; do { j = rand(); } while (j >= RAND_MAX - (RAND_MAX % modulo)); j %= modulo; if (j > 0) { int tmp = array[i]; array[i] = array[i + j]; array[i + j] = tmp; } } for (unsigned i = 0; i < N; ++i) { printf("%u. %d\n", i + 1, array[i]); } return 0; } 

Por favor, siga los enlaces de referencia en el código.

Sugeriría una solución universal:

  • matriz de cualquier tamaño

  • Límites inferiores y superiores enviados como parámetros.

     #include  #include  #include  void random(int* values, int amount, int lower_bound, int upper_bound) { int i=0, j=0, temp; if(amount > upper_bound - lower_bound + 1) return; // if there are more numbers than given bound for(i=0; i=0; --j) if(temp==values[j]) break; if(temp==values[j]) continue; values[i]=temp; ++i; } } int main() { srand(time(NULL)); int arr[4]={0,0,0,0}; random(arr, 4, 5, 10); for(int i=0; i<4; ++i) printf("%d\n", arr[i]); } 

Con esto puede tener (por ejemplo) 10 números de valores originales de -6 a 7.