| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  06-05-2010, 18:05 | #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. | 
|   |   | 
|  06-05-2010, 18:13 | #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"  Chi scherza col fuoco si brucia. 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. | 
|   |   | 
|  06-05-2010, 18:16 | #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. | |
|   |   | 
|  06-05-2010, 18:21 | #4 | |
| Junior Member Iscritto dal: May 2010 
					Messaggi: 9
				 | Quote: 
  Grazie!!! | |
|   |   | 
|  06-05-2010, 18:25 | #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. | 
|   |   | 
|  06-05-2010, 18:34 | #6 | 
| Junior Member Iscritto dal: May 2010 
					Messaggi: 9
				 | |
|   |   | 
|  06-05-2010, 19:57 | #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.
		 | 
|   |   | 
|  06-05-2010, 21:54 | #8 | 
| Senior Member Iscritto dal: Mar 2006 Città: Milano 
					Messaggi: 832
				 | 
		uh nn lo sapevo   ho sempre reiniziallizato pensando che il seme fosse diverso! | 
|   |   | 
|  06-05-2010, 22:37 | #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. | 
|   |   | 
|  07-05-2010, 09:21 | #10 | |
| Junior Member Iscritto dal: May 2010 
					Messaggi: 9
				 | Quote: 
 | |
|   |   | 
|  07-05-2010, 10:11 | #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. | 
|   |   | 
|  07-05-2010, 10:23 | #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...
		 | 
|   |   | 
|  08-05-2010, 10:42 | #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"  Chi scherza col fuoco si brucia. Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu | 
|   |   | 
|  08-05-2010, 14:33 | #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
		 | 
|   |   | 
|  10-05-2010, 10:13 | #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:35.









 
		 
		 
		 
		









 
  
 



 
                        
                        










