Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato
Nuova frontiera per i robot tagliaerba, con Ecovacs GOAT O1200 LiDAR Pro che riconosce l'ambiente in maniera perfetta, grazie a due sensori LiDAR, e dopo la falciatura può anche rifinire il bordo con il tagliabordi a filo integrato
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere?
Equilibrio e potenza definiscono il Samsung Galaxy S26+, un flagship che sfida la variante Ultra e la fascia alta del mercato con il primo processore mobile a 2nm. Pur mantenendo l'hardware fotografico precedente, lo smartphone brilla per un display QHD+ da 6,7 pollici d'eccellenza, privo però del trattamento antiriflesso dell'Ultra, e per prestazioni molto elevate. Completano il quadro la ricarica wireless a 20W e, soprattutto, un supporto software settennale
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti
Zeekr sbarca ufficialmente in Italia con tre modelli elettrici premium, X, 7X e 001, distribuiti da Jameel Motors su una rete di 52 punti vendita già attivi. La Zeekr X parte da 39.900 euro, la 7X da 54.100: piattaforma a 800V, chip Snapdragon di ultima generazione, ricarica ultraveloce e un'autonomia dichiarata fino a 615 km WLTP. Le prime consegne sono previste a metà aprile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 05-11-2006, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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 11:53.
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 11: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, 11: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, 11: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 12:03.
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12: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, 12: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 12:31.
mad_hhatter è offline   Rispondi citando il messaggio o parte di esso
Old 05-11-2006, 12: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, 12: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, 12:34   #14
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
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, 12:36   #15
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
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, 12:38   #16
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16214
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, 12: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, 13: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, 14: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, 15: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


Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Zeekr X e 7X provate: prezzi, autonomia fino a 615 km e ricarica in 13 minuti Zeekr X e 7X provate: prezzi, autonomia fino a 6...
Marathon: arriva il Fortnite hardcore Marathon: arriva il Fortnite hardcore
HP Imagine 2026: abbiamo visto HP IQ all’opera, ecco cosa può (e non può) fare HP Imagine 2026: abbiamo visto HP IQ all’opera, ...
GeForce NOW: ecco tutte le novità in arr...
Il Realme 16 5G debutta sul mercato glob...
HONOR svela tre nuovi tablet: il più int...
Tineco Floor One S9 Master: aspira e pul...
Vivo X300 Ultra, il lancio globale è ini...
Offerte robot aspirapolvere Amazon: ECOV...
L'AI genera codice in 8 minuti e i senio...
Ring Intercom Audio a 44,99€ su Amazon: ...
Apple iPhone 16 crolla a 689€: ecco perc...
Google Pixel 9 a 449,90€ con caricatore ...
Ecco la top 7 delle offerte Amazon, aggi...
Ex ingegnere ammette il sabotaggio: migl...
I coupon nascosti di Amazon si rinnovano...
Disponibili i video e le immagini in alt...
La NASA ha rilasciato le prime fotografi...
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: 18:12.


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