Originariamente inviato da gygabyte017
te lo spiego in linea teorica: allora tu fai un array di 41 elementi da 0 a 40;
ripeti questo ciclo ogni estrazione
sapendo che:
N è il numero di elementi nell'array
...
estratto = random(N)
scrivi estratto
porta tutti gli elementi negli indici tra estratto e N indietro di un indice, cioè:
codice:
for i=estratto i<N-1 i++
array[i]=array[i+1]
n=N-1
...
l'ho scritto molto velocemente, se non capisci qualcosa chiedi
non è molto efficiente spostare tutte le volte un gran numero di elementi dell'array...
E' possibile procedere inceve ad un semplice scambio dell'elemento estratto e dell'ultimo elemento e ridurre di 1 ogni volta l'intervallo di estrazione:
codice:
#include <stdio.h>
#define MAX 50
int lim, estratto, i, k, tab[MAX], temp;
main()
{
/* inizializzo l'array per la ricerca casuale */
for (i=0; i<MAX; i++) tab[i]=i;
/* cerco elemento casuale tra i primi lim valori di tab */
lim=MAX;
for (i=0; i<MAX; i++)
{
k=rand()%lim; /* scelgo elemento casuale dell'array */
estratto= tab[k]; /* ne estraggo il valore, questo è il risultato dell'estrazione! */
printf("%d) %d\n",i,estratto);
tab[k]=tab[lim-1]; /* sposto ultimo elemento al posto di quello appena estratto */
lim--; /* ignoro ultimo elemento per la prox estrazione */
}
}