|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: May 2010
Messaggi: 9
|
[C - C++] generare tre numeri casuali senza ripetizione
Rieccomi di nuovo, ho cercato se nei precedenti thread ci fosse qualcosa di simile a quello che serviva a me...ma onestamente non ho trovato nulla...quindi chiedo a voi...ho lanciato all'inizio del main() la funzione "srand(time(NULL));" (ho incluso time.h), ora devo generare tre numeri casuali che devono risultare sempre diversi tra loro. Non devono mai essere uguali, ne a coppie, ne, ovviamente, a triplette.
Ho scritto così... if (casuale1==casuale2 || casuale1==casuale3) casuale1 = 1+rand()%max; if (casuale2==casuale3 || casuale2==casuale1) casuale2 = 1+rand()%max; if (casuale3==casuale2 || casuale3==casuale1) casuale2 = 1+rand()%max; printf ( "\nItre numeri casuali sono : %d, %d, %d", casuale1, casuale2, casuale3); Sembra che funzioni...ma non mi fido manco un pò...mi sembra sbagliato a occhio e croce...che ne dite?? (PS: ovviamente max è una variabile precedentemente definita) Grzie in anticipo... L. Ultima modifica di lorenzd : 06-05-2010 alle 18:08. |
|
|
|
|
|
#2 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Prova a dare un'occhiata qui per l'uso di rand e srand:
http://www.hwupgrade.it/forum/showthread.php?t=1196677 Io genererei i valori volta per volta, registrando il secondo valore solo quando diverso dal primo, e il terzo solo quando diverso dagli altri due.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu Ultima modifica di Ziosilvio : 06-05-2010 alle 18:15. |
|
|
|
|
|
#3 | |
|
Junior Member
Iscritto dal: May 2010
Messaggi: 9
|
Quote:
Però non dice niente sulla ripetitività dei numeri casuali... Ultima modifica di lorenzd : 06-05-2010 alle 18:20. |
|
|
|
|
|
|
#4 | |
|
Junior Member
Iscritto dal: May 2010
Messaggi: 9
|
Quote:
Grazie!!! |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
|
usa l' srand ogni volta prima generare il numero.
e itera fino a quando i 3 numeri sono diversi. |
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: May 2010
Messaggi: 9
|
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Aug 2005
Messaggi: 168
|
Se usi srand(time(null)) prima di ogni numero rischi che la maggior parte dei numeri ti venga uguale. Continui ad inizializzare il generatore con lo stesso seme per parecchi cicli di clock.
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Milano
Messaggi: 832
|
uh nn lo sapevo
ho sempre reiniziallizato pensando che il seme fosse diverso! |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
occhio he rand()%max non e' a distribuzione uniforme.
Vengono privilegiati i valori bassi. se ad esempio max = 15000, e RAND_MAX vale 32768 I valori da 0->2767 hanno probabilita' 3 volte su 2 di comparire rispetto ai valori 2768->14999 Tale discrepanza ci sarebbe sempre, solo meno visibile quando max e' un valore basso. Si annulla quando max e' un divisore di RAND_MAX, che e' il limite superiore del generatore di rand()
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#10 | |
|
Junior Member
Iscritto dal: May 2010
Messaggi: 9
|
Quote:
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Si, non dicevo "se max vale RAND_MAX" (Caso in cui l'anomalia sarabbe peraltro assente), ma se "RAND_MAX vale 32767"
Nel tuo caso, se RAND_MAX=32767 (come in molti casi e'), e max = 37, avrai che i valori 0-> 21 saranno 1/886 piu' probabili dei valori 22->36
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: May 2010
Messaggi: 9
|
AAAAAAAAAAAAAAAA....ok, capito...non c'ero arrivato...cmq, non riesco ancora a scrivere qualcosa che funzioni...ora mi ci metto con più impegno e poi posto...
|
|
|
|
|
|
#13 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Puoi farlo per quanti numeri vuoi, se usi un array dinamico e fai ogni volta una ricerca per vedere se il valore appena generato è già nell'array.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
se il tuo RAND_MAX non è qualcosa di esageratamente grande puoi fare un array di dimensione RAND_MAX (ad esempio un array di char così occupi meno spazio possibile) inizializzato con calloc.. dopo di che puoi generare numeri random e guardare il valore corrispondente nell'array.. se è 0 (o \0 nel caso dell'array di char) vuol dire che è un numero non ancora estratto, quindi cambi il valore in un altro "valore sentinella".. altrimenti puoi decidere cosa fare: estrarne un altro, oppure usare il valore che hai estratto per generarne un altro in base a una funzione
|
|
|
|
|
|
#15 |
|
Junior Member
Iscritto dal: May 2010
Messaggi: 9
|
Fatto...so di avere scritto il goto che non è propriamente consigliato in nessun caso, però almeno funziona...ve lo assicuro...questa tira fuori numeri casuali compresi tra 0 e 4 a triplette per 200 volte...Ci sono delle variabili e degli array che non servono a nulla ai fini del nostro problema ma chesono comunque dichiarati perchè mi servono nel resto del programmino...Se qualcuno ha da migliorare il codice, ovviamente, faccia pure!!!!!
Ciauz!! #include <stdio.h> #include <stdlib.h> #include <iostream> #include <cstdlib> #include <time.h> int main() { srand (time(NULL)); int v, app0, app1, app2, z, prova1, counter=0, prova2, p0, p1, p2, ciclo; int u; int g[30]={1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}; int casuale[3], ciao[30], nuovo[30]; for (ciclo =0; ciclo <=200; ciclo++) { casuale[0]=rand()%5; for(counter=0;counter<=2 { p1=rand()%5; primo: if (p1 == casuale[0]){ p1=rand()%5; goto primo;} else { casuale[1] = p1; counter = counter +1; } p2=rand()%5; secondo: if (p2 == casuale[1] || p2 == casuale[0]){ p2 = rand()%5; goto secondo;} else{ casuale[2] = p2; counter = counter+1; } } ciclo=ciclo+1; printf( "\n%d, %d, %d", casuale[0], casuale[1], casuale[2]); } |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:15.




















