|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Feb 2006
Messaggi: 25
|
Problema col Numero Random in c++
Salve, devo generare 4 numeri diversi tra loro e compresi tra 1 e 9, allora ho usato il codice:
Codice:
a = rand() % 1 + 8;
b=rand() % 2 + 7;
while (b==a)
{
b=rand() % 2 + 7;
}
c=rand() % 3 + 6;
while (c==a || c==b)
{
c=rand() % 3 + 6;
}
d=rand() % 4 + 5;
while (d==a || d==b || d==c)
{
d=rand() % 4 + 5;
}
|
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Feb 2006
Messaggi: 25
|
Questo è proprio il codice completo:
Codice:
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
srand((unsigned)time(NULL));
int a,b,c,d;
a = rand() % 1 + 8;
b=rand() % 2 + 7;
while (b==a)
{
b=rand() % 2 + 7;
}
c=rand() % 3 + 6;
while (c==a || c==b)
{
c=rand() % 3 + 6;
}
d=rand() % 4 + 5;
while (d==a || d==b || d==c)
{
d=rand() % 4 + 5;
}
cout<<"A " <<a;
cout<<endl<<"B "<<b;
cout<<endl<<"C "<<c;
cout<<endl<<"D "<<d<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
A=8 B=7 C=6 D=5 |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Jul 2003
Città: pisa
Messaggi: 141
|
l'istruzione corretta per generare un numero random tra 1 e 9 è
Codice:
rand()%9 + 1 |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
posto che non ho ben capito che elaborazioni fai su a,b,c,d (ma ho letto due secondi
te lo chiedo perchè se tale metodo torna sempre lo stesso valore allora è logico che il tuo programma genererà sempre gli stessi numeri pseudocasuali |
|
|
|
|
|
#5 | |
|
Junior Member
Iscritto dal: Feb 2006
Messaggi: 25
|
Quote:
E allora per generare tra 2 e 9 ci vuole questo codice: Codice:
rand()%9 + 2 |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
nono fermo... che pasticcio!
il metodo rand() genera una sequenza di numeri casuali secondo una funzione generatrice. quindi se tu fai 4 volte rand()%<n> otterrai sempre gli stessi 4 numeri. come cambiare? prima di generare i numeri definisci: Codice:
int seed; cout << "inserire il seed"<< endl; cin >> seed; srand(seed);
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB Ultima modifica di leox@mitoalfaromeo : 05-11-2006 alle 11:53. |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Feb 2006
Messaggi: 25
|
leox@mitoalfaromeo ti puoi spiegare meglio... non ho capito bene!
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
Quote:
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
ho anche visto meglio ora... avevi già usato srand() ma lo usavi in maniera non corretta.
in primo luogo non è necessario cambiare ogni volta la formula che ti genera il numero casuale... dovrai sempre usare x=rand()%9+1; è già rand che ti garantisce che saranno diversi... poi ovviamente nell'estrarre 4 numeri casuali su 9 disponibili è facile che si ripetano tra loro...ma il tuoi cicli while lo evitano... però otterrai sempre la stessa sequenza se non cambierai il contenuto di srand().
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB Ultima modifica di leox@mitoalfaromeo : 05-11-2006 alle 12:03. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
|
i valori casuali una volta posto il seed con il time è impossibili che escano sempre uguali....
prova con srand((unsigned) time(0)) come diceva leox ti conviene usare sempre la stessa formula e poi magari controlli se il numero non sia già uscito in tal caso ripeti la generazione...
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2 |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
ciao, ho appena letto la documentazione sul metodo time() e andava bene come lo avevi scritto tu, passandogli NULL: pensavo fosse un paramentro che time utilizzasse in qualche modo, invece è solo un puntatore per farsi tornare il current_time.
però, stanti così le cose, il tuo codice andava bene, il problema sta da un'altra parte (probabilmente dipende da come usi il rand()) Ultima modifica di mad_hhatter : 05-11-2006 alle 12:31. |
|
|
|
|
|
#12 |
|
Junior Member
Iscritto dal: Feb 2006
Messaggi: 25
|
Il problema l'ho risolto mettendo :
Codice:
x=rand()%9+1; |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
Quote:
rand torna numeri casuali da 0 a 2^32 - 1 il %9 torna il resto della divisione intera "rand() / 9 ". tale resto è ovviamente compreso tra 0 e 8 ora per avere numeri da 1 a 9 devi aggiungere 1 se non ti è chiaro ne parliamo ancora |
|
|
|
|
|
|
#14 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16214
|
Quote:
Il modo classico è una chiamata a srand(time(NULL)). Errore numero uno: qualunque intero modulo uno dà 0, quindi il primo valore sarà in ogni caso 8. Errore numero due: qualunque intero modulo due è 0 oppure 1, quindi il secondo intero sarà sempre o 7 o 8. Dato che ogni volta fai il confronto col numero precedente, il secondo numero sarà sempre 7. Errore numero tre: qualunque intero modulo tre è 0 oppure 1 oppure 2, quindi il secondo intero sarà sempre o 6 o 7 o 8. Dato che ogni volta fai il confronto coi numeri precedenti, il terzo numero sarà sempre 6. Errore numero quattro: qualunque intero modulo quattro è 0 oppure 1 oppure 2 oppure 3, quindi il secondo intero sarà sempre o 5 o 6 o 7 o 8. Dato che ogni volta fai il confronto coi numeri precedenti, il quarto numero sarà sempre 5. Trovi risposte più dettagliate QUI.
__________________
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 |
|
|
|
|
|
|
#15 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16214
|
Quote:
Trovi più informazioni QUI
__________________
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 |
|
|
|
|
|
|
#16 | |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16214
|
Quote:
Trovi più informazioni QUI.
__________________
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 |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Oct 2006
Messaggi: 1105
|
hai ragione. grazie per il tutorial
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Nessuno però si è preoccupato di dire che rand() non è un buon generatore di numeri casuali, assolutamente da evitare ovunque il numero casuale sia cruciale per l'applicativo come ad esempio la generazione di dithering.
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
|
Quote:
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:12.



















