Oppure

Loading
21/06/11 19:41
crybot
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 22/06/11 12:15
aaa
21/06/11 23:17
anthony015
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...
aaa
22/06/11 12:06
crybot
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 22/06/11 12:07
aaa
22/06/11 13:46
anthony015
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....
aaa
22/06/11 13:52
crybot
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 ;)
aaa
22/06/11 14:05
anthony015
non credo di aver capito, in ogni caso tenterò di rispiegarti il codice:
ora che ci penso, comunque il for è inutile:
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...
aaa
22/06/11 14:10
crybot
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:
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 :yup:

comunque grazie ancora ;)
aaa
24/06/11 16:14
comina8
Oltre al metodo di anthony015 un codice equivalente ma (secondo me) più leggibile sarebbe:

//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
aaa