PDA

Visualizza la versione completa : [C] Random


Vincent81
23-12-2005, 17:47
Ciao a tutti,
mi servirebbe sapere se esiste un codice in c che genera una sequenza di numeri casuali ma senza ripetizioni

ad esempio se voglio fare un random di 4 numeri per 4 volte deve darmi
1234 o 2134 o 3241 e cosi via... ma mai ripetere 2 volte 1 numero

al momento ho usato la funzione random e con il tempo di sistema ma non riesco a far uscire cifre distinte... esiste una particolare funzione???

grazie^^

king64
23-12-2005, 18:14
Se la funzione rand è progettata bene è ovvio che devi considerare il fatto che un numero di quattro cifre , al cui interno ci siano due cifre uguali , ha la medesima probabilità di essere generato di quello di quattro cifre con le cifre tutte diverse . In effetti quello che tu richiedi è la generazione casuale di permutazioni . A questo punto devi scriverti una funzione ad hoc . Saluti :ciauz:

Johnny_Depp
23-12-2005, 18:30
il linguaggio anche nel titolo, please

Vincent81
23-12-2005, 23:05
Originariamente inviato da Johnny_Depp
il linguaggio anche nel titolo, please

Mi dice di dover contattare l'amministratore per modificare il messaggio....


cmq riguardo il programma che genera permutazioni...
ci stavo pensando un po' su...
iterativo sembra un casino (piu che altro troppi confronti da fare)
forse ricorsivo risulta + semplice

avete qualche spunto?

ibykos
24-12-2005, 01:21
Potresti creare una funzione in questo modo




#define CIFRE 9
#define USED -1

int diamoInumeri[CIFRE]; /*variabile globale*/
int validi; /*variabile globale*/

/*successivamente crei una funzione che inizializza il vettore*/

void inizializza (int n){
int i=0;

for (i=0;i<n;i++)
diamoInumeri[i] = i+1; /*le cifre da 1 a 9 che ci servono*/

validi=n; /*so che nel vettore ho n elementi validi*/
}

/*ora serve una funzione che mi generi i numeri casuali che mi servono*/

int generaNumero (){

int indice,
i=0,
ritorno;

indice = rand()%validi;

ritorno = diamoInumeri[indice];

for (i=indice;i<validi;i++)
diamoInumeri[i]=diamoInumeri[i+1];

validi--;

/*con queste due operazioni traslo indietro di una posizione i
i numeri validi coprendo quello utilizzato, inoltre decremento il
numero di elementi validi*/

return ritorno;

}

/*ora abbiamo tutte le funzioni che servono, proviamo per esempio a generare un po' di permutazioni delle cifre da 1 a 5*/

while (voglio permutazioni){

inizializza(5) /*così le cifre 6-9 sono inutilizzabili*/

for (i=0;i<5;i++)
printf ("%d ",generaNumero());

printf ("\n");
}



Con queste due funzioni (non ho provato a compilarle, potrebbero contenere qualche errore) dovresti riuscire a fare tutto.

Ciao!!

unomichisiada
24-12-2005, 02:53
Originariamente inviato da Vincent81
Ciao a tutti,
mi servirebbe sapere se esiste un codice in c che genera una sequenza di numeri casuali ma senza ripetizioni

ad esempio se voglio fare un random di 4 numeri per 4 volte deve darmi
1234 o 2134 o 3241 e cosi via... ma mai ripetere 2 volte 1 numero

al momento ho usato la funzione random e con il tempo di sistema ma non riesco a far uscire cifre distinte... esiste una particolare funzione???

grazie^^
Io non ho capito bene cosa devi fare...Prova a speigare bene quali sono gli input e quali devono essere gli output

Samuele_70
24-12-2005, 12:38
Originariamente inviato da Vincent81

cmq riguardo il programma che genera permutazioni...
ci stavo pensando un po' su...
iterativo sembra un casino (piu che altro troppi confronti da fare)
forse ricorsivo risulta + semplice

avete qualche spunto?

Potresti utilizzare il classico algoritmo del gioco della tombola ( visto che siamo nel periodo giusto:D ):

1) Inserisci tutte le combinazioni possibili in un array (meglio se usi una lista)
2) Tramite funzione rand()*grandezza_array 'peschi' nell'array il valore
3) Cancelli dalla lista/array il valore usato e decrementi 'grandezza_array'
4) Se 'grandezza_array'>0 torni al unto 2.

Può andare ?

king64
24-12-2005, 14:05
Originariamente inviato da Samuele_70
Potresti utilizzare il classico algoritmo del gioco della tombola ( visto che siamo nel periodo giusto:D ):

1) Inserisci tutte le combinazioni possibili in un array (meglio se usi una lista)
2) Tramite funzione rand()*grandezza_array 'peschi' nell'array il valore
3) Cancelli dalla lista/array il valore usato e decrementi 'grandezza_array'
4) Se 'grandezza_array'>0 torni al unto 2.

Può andare ?

La tecnica puo' essere accettabile per un numero di elementi n intorno alla decina , ma troppo dispendioso in termini computazionali per un numero di elementi sufficientemente grande . Le permutazioni di n elementi sono n ! . Per cui avremo : un tempo Tg di generazione più un tempo Tv di verifica. Usando una lista (o un array) il tempo di verifica Tv sarà proporzionale al numero degli elementi della lista .
P.S. Buon Natale a tutti :ciauz:

XiN
26-12-2005, 00:19
Se stai lavorando su sistemi unix o unix-like, puoi usare il device /dev/random o /dev/urandom (random(4), urandom(4)) e fare qualcosa di simile:


int
urandint(void)
{
FILE *devurandom;
int randomint;
if( (devurandom = fopen("/dev/urandom", "rb")) == NULL )
{
fprintf(stderr, "Impossibile accedere al device /dev/urandom\n");
exit(1);
}
fread(&randomint, sizeof(int), 1, devurandom);
fclose(devurandom);
return abs(randomint);
}

ovviamente la funzione è da chiamare in un ciclo..

Loading