Originariamente inviato da COMANDANTE SPACE
mi sto esercitando a scrivere il gioco Mastermind in c++ con interfaccia testuale(roba da primo anno di informatica) e ho una procedura che dà problemi. Ve la riporto:
Codice PHP:
void creaNumeri(int numeri[5]){
unsigned seed = time(NULL);
srand(seed);
for(int i = 0; i<5; i++){
numeri[i] = rand() % 10;
for(int j=i-1; j>=0; j--){
while(numeri[i]==numeri[j]) {
numeri[i]=rand() % 10;
}
}
}
}
il problema è che ogni tanto nell'array ci finiscono due cifre uguali(es. 42001)...
Certo, perché la funzione rand non ti garantisce l'unicità della estrazione. Devi realizzare un "vero" sistema di estrazione. In pratica devi avere un "pool" ("pozza", tradotto letteralmente) di numeri da 0 a 9. Quando ne estrai uno, lo devi togliere dal pool in modo da non ripescarlo più.
Tradotto in codice "C", si può fare così (secondo la mia personale implementazione):
codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct
{
int num[10];
int size;
} ESTRAZIONE;
void EstrazioneInit (ESTRAZIONE *e)
{
int i;
for (i = 0; i < 10; i++)
e->num[i] = i;
e->size = 10;
}
int EstrazioneGet (ESTRAZIONE *e)
{
int i, n;
if (e->size == 0)
return -1;
i = rand () % e->size;
n = e->num[i];
for (e->size--; i < e->size; i++)
e->num[i] = e->num[i+1];
return n;
}
int main (void)
{
int i;
ESTRAZIONE e;
srand ((unsigned int) time (NULL));
EstrazioneInit (&e);
/*---- Estrae 5 numeri da 0 a 9 ----*/
for (i = 0; i < 5; i++)
printf ("%d ", EstrazioneGet (&e));
printf ("\n");
return 0;
}