Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - generare numeri random da 1 a 700000
Forum - C/C++ - generare numeri random da 1 a 700000

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
crybot (Normal User)
Rookie


Messaggi: 43
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 21:41
Martedì, 21/06/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
PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 1:17
Mercoledì, 22/06/2011
Codice sorgente - presumibilmente C/C++

  1. int random=rand()%35;
  2. int casuale;
  3. for(int i=0;i<35;i++)
  4. if(random==i)
  5. {
  6.      casuale=(rand()%20000)+(i*20000);
  7. }


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...

PM Quote
Avatar
crybot (Normal User)
Rookie


Messaggi: 43
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 14:06
Mercoledì, 22/06/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
PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 15:46
Mercoledì, 22/06/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....

PM Quote
Avatar
crybot (Normal User)
Rookie


Messaggi: 43
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 15:52
Mercoledì, 22/06/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 ;)

PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 16:05
Mercoledì, 22/06/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++

  1. int random=rand()%35;
  2. 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...

PM Quote
Avatar
crybot (Normal User)
Rookie


Messaggi: 43
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 16:10
Mercoledì, 22/06/2011
Testo quotato

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++

  1. int random=rand()%35;
  2. 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 ;)

PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 18:14
Venerdì, 24/06/2011
Oltre al metodo di anthony015 un codice equivalente ma (secondo me) più leggibile sarebbe:

Codice sorgente - presumibilmente Plain Text

  1. //per inizializzare la casualità
  2. //da fare UNA VOLTA SOLA all'intero di un programma
  3. srand(time(NULL));
  4. NGen=(rand()%n)+1; //genera numeri da 1 a n compresi
  5.                                 //senza il "+1" andrebbe da 0 a n-1



Spero di essere stato d'aiuto.
Ciao ciao

PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 18:27
Venerdì, 24/06/2011
Testo quotato

Postato originariamente da comina8:

Oltre al metodo di anthony015 un codice equivalente ma (secondo me) più leggibile sarebbe:

Codice sorgente - presumibilmente Plain Text

  1. //per inizializzare la casualità
  2. //da fare UNA VOLTA SOLA all'intero di un programma
  3. srand(time(NULL));
  4. NGen=(rand()%n)+1; //genera numeri da 1 a n compresi
  5.                                 //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
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo