Torna indietro   Hardware Upgrade Forum > Software > Programmazione

DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-11-2006, 12:03   #1
virtual89
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;
}
E le variabili a,b,c,d vengono sempre generate con lo stesso valore, cioè a=8;b=7;c=6;d=5 . Come posso risolvere questo problema e avere i valori delle variabili diversi?
virtual89 è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:08   #2
virtual89
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;
}
E mi genera sempre
A=8
B=7
C=6
D=5
virtual89 è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:13   #3
pela
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
visto che rand() torna un numero casuale fra 0 e RAND_MAX e applicando l'operatore modulo 9 si ottiene un valore fra 0 e 8
pela è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:14   #4
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
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 ), che cosa fa il metodo time(NULL)?

te lo chiedo perchè se tale metodo torna sempre lo stesso valore allora è logico che il tuo programma genererà sempre gli stessi numeri pseudocasuali
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:32   #5
virtual89
Junior Member
 
Iscritto dal: Feb 2006
Messaggi: 25
Quote:
Originariamente inviato da pela
l'istruzione corretta per generare un numero random tra 1 e 9 è
Codice:
rand()%9 + 1
Scusa ma con questo codice ottengo un numero tra 1 e 9 ?
E allora per generare tra 2 e 9 ci vuole questo codice:
Codice:
rand()%9 + 2
E' così?
virtual89 è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:51   #6
leox@mitoalfaromeo
Senior Member
 
L'Avatar di leox@mitoalfaromeo
 
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);
ora ogni volta che cambierai il seed cambierà la sequenza...
__________________
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:53.
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:53   #7
virtual89
Junior Member
 
Iscritto dal: Feb 2006
Messaggi: 25
leox@mitoalfaromeo ti puoi spiegare meglio... non ho capito bene!
virtual89 è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:54   #8
leox@mitoalfaromeo
Senior Member
 
L'Avatar di leox@mitoalfaromeo
 
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
Quote:
Originariamente inviato da virtual89
leox@mitoalfaromeo ti puoi spiegare meglio... non ho capito bene!
ho editato
__________________
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
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12:59   #9
leox@mitoalfaromeo
Senior Member
 
L'Avatar di leox@mitoalfaromeo
 
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 13:03.
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:09   #10
TuLKaS85
Senior Member
 
L'Avatar di TuLKaS85
 
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
TuLKaS85 è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:27   #11
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
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 13:31.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:28   #12
virtual89
Junior Member
 
Iscritto dal: Feb 2006
Messaggi: 25
Il problema l'ho risolto mettendo :
Codice:
x=rand()%9+1;
Ma posso sapere più in specifico in base a cosa vengono generati i numeri, cioè quell'1 e 9 che significato hanno?
virtual89 è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:33   #13
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
Quote:
Originariamente inviato da virtual89
Il problema l'ho risolto mettendo :
Codice:
x=rand()%9+1;
Ma posso sapere più in specifico in base a cosa vengono generati i numeri, cioè quell'1 e 9 che significato hanno?

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
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:34   #14
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16215
Quote:
Originariamente inviato da virtual89
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;
}
E le variabili a,b,c,d vengono sempre generate con lo stesso valore, cioè a=8;b=7;c=6;d=5 . Come posso risolvere questo problema e avere i valori delle variabili diversi?
Errore numero zero: il generatore va inizializzato ogni volta in maniera diversa per evitare di ripetere sempre la stessa sequenza.
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" 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
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:36   #15
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16215
Quote:
Originariamente inviato da pela
l'istruzione corretta per generare un numero random tra 1 e 9 è
Codice:
rand()%9 + 1
visto che rand() torna un numero casuale fra 0 e RAND_MAX e applicando l'operatore modulo 9 si ottiene un valore fra 0 e 8
Il valore così generato sarà tra 1 e 9, ma avrà distribuzione non uniforme e/o sarà facile da prevedere.
Trovi più informazioni QUI
__________________
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
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:38   #16
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16215
Quote:
Originariamente inviato da mad_hhatter
rand torna numeri casuali da 0 a 2^32 - 1
rand restituisce valori pseudorandom tra 0 e RAND_MAX, che non è obbligata ad essere il valore che hai detto tu.
Trovi più informazioni QUI.
__________________
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
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 13:41   #17
mad_hhatter
Senior Member
 
L'Avatar di mad_hhatter
 
Iscritto dal: Oct 2006
Messaggi: 1105
hai ragione. grazie per il tutorial
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 14:43   #18
tomminno
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.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 15:13   #19
leox@mitoalfaromeo
Senior Member
 
L'Avatar di leox@mitoalfaromeo
 
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
Quote:
Originariamente inviato da tomminno
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.
bè ma se allora lo vogliamo affossare del tutto diciamo anche che la generazione dipende dal compilatore e dalla macchina sul quale viene eseguito, cosa che invece non succede in java col metodo Random(). (infatti per una questione di ripetibilità ho dovuto fare un generatore di istanze in java quando il programma che sto scrivendo per la tesi è in c++)
__________________
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
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 16:08   #20
virtual89
Junior Member
 
Iscritto dal: Feb 2006
Messaggi: 25
Grazie a tutti...
A me il Random serviva per realizzare il Master Mind che devo portare a scuola domani...E l'ho finito...
Se volete dare un'occhiata andate QUI
vi scaricherà direttamente il gioco!
Buon divertimento!
virtual89 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
Copilot nella Sidebar di Edge sparisce p...
X terrorizza gli utenti con una mano gig...
Firmware UEFI, embargo saltato per error...
Android 18 limiterà le modifiche alla ru...
Silent Hill 1 Remake, nuove indiscrezion...
Keystone distrugge 18.835 hardware walle...
GTA VI potrebbe richiedere più GB...
Nokia 6300 rinasce grazie all'IA: arriva...
iPhone 18e: le prime indiscrezioni antic...
Motorola Edge 70 Neo in arrivo, un leak ...
Apple rilascia iOS 27.2 e iPadOS 27.2: n...
Ondata di licenziamenti in casa PlayStat...
macOS 27.2 Golden Gate è disponib...
Fujifilm vuole quintuplicare la produzio...
ChatGPT ora legge email e calendario di ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 12:47.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v