crybot (Normal User)
Rookie
Messaggi: 43
Iscritto: 11/04/2011
|
salve a tutti, sto cercando di creare un generatore di crossowords (cruciverba), sul cammino verso il termine di questo progetto si sono creati vari problemi, molti dei quali ho risolto, ma uno di questi e`, come da titolo, la necessita` di generare numeri pseudo-casuali vicini a 700000 (che sarebbe l'elenco di parole della wordlist che uso per generare i cruciverba) per estrarre a sorte piu` parole per creare le corrispondenze verticali del cruciverba. ora, la funzione rand() arriva soltanto fino a 30000, un po` poco visto le mie necessita`, esiste un modo, non troppo complicato, per generare numeri oltre questo limite? grazie a tutti
P.S. avevo pensato a distribuire le parole in diversi file ordinati per lettera. cosi` ogni volta sorteggierei una lettera, e dopodiche` un numero, che dovrebbe essersi di molto assottigliato, ma molto probabilmente ancora superiore a 30000...
Ultima modifica effettuata da crybot il 22/06/2011 alle 14:15 |
|
anthony015 (Member)
Pro
Messaggi: 116
Iscritto: 20/05/2011
|
Codice sorgente - presumibilmente C/C++ |
int random=rand()%35;
int casuale;
for(int i=0;i<35;i++)
if(random==i)
{
casuale=(rand()%20000)+(i*20000);
}
|
random va fino a 35 che sarebbe 700000/20000(20000 l'ho scelto per comodità di divisione), in base a random si vede in quale "fascia" calcolare il numero pseudocasuale, al numero più basso della fascia si somma un numero casuale che non permetta di sforare nella fascia successiva e siamo a posto, con ogni numero che ha la stessa probabilità di capitare quanto che ne capiti un altro...
|
|
crybot (Normal User)
Rookie
Messaggi: 43
Iscritto: 11/04/2011
|
grazie, questo risolve parte del mio problema, in quanto molte parole, non verranno mai estratte... io avrei necessita` di qualcosa che generi numeri random da 1 a 700000, dove "da 1 a 700000" intendo dire che anche i numeri piu` bassi devono avere la stessa probabilita` di estrazione. penso di essermi spiegato adesso.
grazie comunque
Ultima modifica effettuata da crybot il 22/06/2011 alle 14:07 |
|
anthony015 (Member)
Pro
Messaggi: 116
Iscritto: 20/05/2011
|
a me pare che abbiano la stessa probabilità, prova a creare un piccolo programmino che simuli milioni o meglio miliardi di lanci e a tenere il conto del numero di uscite per ogni numero, poi se vuoi fare un lavoro fatto bene ne trovi la percentuale e guardi se le probabilità sono rispettate....
|
|
crybot (Normal User)
Rookie
Messaggi: 43
Iscritto: 11/04/2011
|
il fatto e` che proprio alcuni numeri non vengono estratti, in quanto soltanto se (quotando il tuo codice) i == random viene generato un numero casuale di una certa grandezza, altrimenti i numeri piu` piccoli generati possono arrivare soltanto fino a 35... questo e` cio` che la tua soluzione fa...
se non ho capito qualcosa, o forse hai sbagliato a scrivere, non c'e` problema
|
|
anthony015 (Member)
Pro
Messaggi: 116
Iscritto: 20/05/2011
|
non credo di aver capito, in ogni caso tenterò di rispiegarti il codice:
ora che ci penso, comunque il for è inutile:
Codice sorgente - presumibilmente C/C++ |
int random=rand()%35;
int casuale;=(rand()%20000)+(random*20000);
|
rand()%35 genera un numero pseudocasuale tra 0 e 34, poi lo moltiplichiamo per 20000 per vedere in quale range trovare il numero casuale(se random è 0 il range è 0-19999, con 1 è 20000-39999, fino a 34 che sarà 680000-699999), a questo ci aggiungiamo un numero pseudocasuale che va da 0 a 19999 e quindi possiamo avere un numero >=random e <(random+20000), quindi abbiamo un numero casuale tra 0 e 699999, cioè 700000 numeri...
|
|
crybot (Normal User)
Rookie
Messaggi: 43
Iscritto: 11/04/2011
|
Postato originariamente da anthony015:
non credo di aver capito, in ogni caso tenterò di rispiegarti il codice:
ora che ci penso, comunque il for è inutile:
Codice sorgente - presumibilmente C/C++ |
int random=rand()%35;
int casuale;=(rand()%20000)+(random*20000);
|
rand()%35 genera un numero pseudocasuale tra 0 e 34, poi lo moltiplichiamo per 20000 per vedere in quale range trovare il numero casuale(se random è 0 il range è 0-19999, con 1 è 20000-39999, fino a 34 che sarà 680000-699999), a questo ci aggiungiamo un numero pseudocasuale che va da 0 a 19999 e quindi possiamo avere un numero >=random e <(random+20000), quindi abbiamo un numero casuale tra 0 e 699999, cioè 700000 numeri... |
beh cosi` torna... nel codice di prima avevi inserito oltre al for, anche un if di troppo
comunque grazie ancora |
|
comina8 (Normal User)
Pro
Messaggi: 86
Iscritto: 18/06/2011
|
Oltre al metodo di anthony015 un codice equivalente ma (secondo me) più leggibile sarebbe:
Codice sorgente - presumibilmente Plain Text |
//per inizializzare la casualità
//da fare UNA VOLTA SOLA all'intero di un programma
srand(time(NULL));
NGen=(rand()%n)+1; //genera numeri da 1 a n compresi
//senza il "+1" andrebbe da 0 a n-1
|
Spero di essere stato d'aiuto.
Ciao ciao
|
|
anthony015 (Member)
Pro
Messaggi: 116
Iscritto: 20/05/2011
|
Postato originariamente da comina8:
Oltre al metodo di anthony015 un codice equivalente ma (secondo me) più leggibile sarebbe:
Codice sorgente - presumibilmente Plain Text |
//per inizializzare la casualità
//da fare UNA VOLTA SOLA all'intero di un programma
srand(time(NULL));
NGen=(rand()%n)+1; //genera numeri da 1 a n compresi
//senza il "+1" andrebbe da 0 a n-1
|
Spero di essere stato d'aiuto.
Ciao ciao |
il problema è che ad n anche se da 700000, rand al massimo ritorna 32767... Ultima modifica effettuata da anthony015 il 24/06/2011 alle 18:27 |
|