
Originariamente inviata da
raffaeledicapri
mmm bene ahah grazie mille per la risposta

purtroppo non sono ancora a questi livelli di C quindi mi dovrò arrangiare :/ vediamo se riesco a convertirlo ad un "c base" che posso capire ahah grazie mille

Guarda che questa domanda è stata afforontata svariate altre volte. Ed esiste un algoritmo più efficiente. Basta che fai una ricerca nel forum. In sostanza prendi un array di N elementi che contiene tutte le possibili scelte, generi un indice casuale i fra 0 e N-1 scambi gli elementi i e N-1 e diminuisci N di uno quindi ritorni l'elemento che originariamente si trovava in i.
Eccoti un esempio di una possibile implementazione in C che usa delle variabili globali per semplicità. Il main è un esempio e l'output te ne fa vedere il funzionamento
codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
int nums[N];
int n;
void init_gen() {
int i;
for(i = 0; i < N; ++i) {
nums[i] = i+1;
}
n = N;
}
void reset_gen() {
n = N;
}
int gen() {
//nel caso tutti i numeri siano stati generati segnala un uso innappropriato
if(n < 1) {
return -1;
}
int i = rand() % n;
--n;
int tmp = nums[i];
nums[i] = nums[n];
nums[n] = tmp;
return tmp;
}
int main(void) {
srand(time(NULL));
init_gen();
int i, j;
for(i = 0; i < 6; ++i) {
for(j = 0; j < 6; ++j) {
printf("%d ", gen());
}
printf("\n");
reset_gen();
}
return 0;
}
Output di esempio
codice:
1 4 5 2 3 -1
4 2 5 1 3 -1
3 2 1 5 4 -1
4 5 1 3 2 -1
1 2 4 5 3 -1
5 4 3 2 1 -1
Per risolvere il tuo problema ti basta sostanzialmente cambiare N, ma il codice è facilmente addattabile a casi più complessi in cui gli elementi generati/mescolati non sono semplici numeri.