Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-06-2004, 00:54   #1
[kiriku]
Member
 
L'Avatar di [kiriku]
 
Iscritto dal: Apr 2003
Città: Milano
Messaggi: 58
C e rand()

gente, mi sono accorto che la funzione rand() restituisce sempre lo stesso valore... nel senso che, è vero, se faccio x esempio un ciclo for e faccio scrivere 100 volte il valore di rand() questo è sempre diverso, ma alla successiva esecuzione del programma i numeri sono gli stesis nello stesso ordine... come faccio a evitare la cosa e ad ottenere numeri diversi ad ogni esecuzione del programma?

graz

ciao
__________________
kiriku - Lastcode Software
www.lastcode.org/kiriku
[kiriku] è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 08:25   #2
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
inizializza il seme con un bell srand(time(NULL)) cosi rand ha il seme dell tempo di sisema che è sempre diverso.
Poi per prendere un num fai rand()%N dove N è il numero massimo che vuoi ottenere


Ciao
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 08:50   #3
[kiriku]
Member
 
L'Avatar di [kiriku]
 
Iscritto dal: Apr 2003
Città: Milano
Messaggi: 58
grazie funziona!

ciao
__________________
kiriku - Lastcode Software
www.lastcode.org/kiriku
[kiriku] è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 10:49   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Una piccola nota rand()%N permette di ottenere interi fra 0 e N-1
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 10:50   #5
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da cionci
Una piccola nota rand()%N permette di ottenere interi fra 0 e N-1
hai ragione :P
Hai fatto bene a puntualizzare
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 12:15   #6
kk3z
Senior Member
 
L'Avatar di kk3z
 
Iscritto dal: Nov 2003
Messaggi: 980
grazie mille, serve anche a me
kk3z è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 13:14   #7
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
ragazzi scusate ma non è possibile che se il ciclo for è eseguito molto velocemente il srand(time(NULL)) restituisca sempre lo stesso valore, perchè il time(NULL) restituisce sempre lo stesso valore, o questo pericolo non sussiste?

Ultima modifica di VegetaSSJ5 : 07-06-2004 alle 13:49.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 13:20   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Il pericolo sussiste...infatti srand(time(NULL)) va fatto una sola volta all'interno di tutto il programma !!!
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 13:47   #9
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da cionci
Il pericolo sussiste...infatti srand(time(NULL)) va fatto una sola volta all'interno di tutto il programma !!!
cionci una soluzione potrebbe essere fare srand(time(NULL) + i) dove i è il contatore del ciclo for??
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 13:54   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
No...la srand DEVE essere chiamata una sola volta nel programma in modo da sfruttare lo stesso seme per la generazioni di tutti i numeri random di un programma...altrimenti non sono più molto casuali (vabbè che non lo erano nemmeno prima, ma se lo chiami più volte lo sono meno )...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 14:24   #11
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
cionci dimmi se questo può andar bene
Codice:
  .
  .
int i=0;
srand(time(NULL)+i);
for (i=0; i<50; ++i) printf("%d", rand());
  .
  .
va bene così? fammi capire una cosa. la srand cambia il seme per la generezione di numeri casuali. se io metto una costante lui mi genera sempre lo stesso numero. se io metto delle variabili tipo srand(time(NULL)+i) la rand() va a ricalcolarsi ogni volta l'output di time(NULL)+i oppure calcola l'output sempre a partire dall'input che ha ricevuto la prima volta (cioè quando si è chiamato srand(time(NULL)+i))?
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 15:34   #12
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Il seme del generatore di numeri casuali e' sempre lo stesso; srand lo inizializza con un valore specifico (eventualmente calcolato sul momento), mentre rand lo usa per calcolare il nuovo valore e lo aggiorna con questo.
Per cui, in una sequenza srand --- rand --- srand --- rand, la seconda rand parte dal valore impostato dalla seconda srand, non da quello impostato dalla prima rand.
[EDIT] Invece, in srand --- rand --- rand, la seconda rand parte dal valore impostato dalla prima rand. [/EDIT]

Io chiamerei srand una volta sola, all'inizio del programma.
La teoria dice che la sequenza dei valori di rand a partire da un seme scelto "casualmente" e' "casuale"; ma non penso che questo valga anche per una serie di semi scelti piu' o meno "sequenzialmente".
Eventualmente, darei la possibilita' di chiamarla con un valore a scelta dell'utente anziche' con l'output di time, in modo da poter sia ottenere un comportamento impredicibile, sia replicare esattamente un esperimento.
__________________
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 : 07-06-2004 alle 17:47.
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 16:11   #13
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Concordo con Ziosilvio
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 16:15   #14
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
se ho capito bene secondo quanto detto da ziosilvio la rand() oltre che a generare un valore partendo da un seme, aggiorna quel seme al valore appena calcolato, pertanto quando si fa una rand() è superfluo fare una srand() per aggiornare il seme quindi la srand() va fatta solo all'inizio del programma giusto?
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-06-2004, 16:20   #15
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Sì...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 15:46   #16
melanippe
Junior Member
 
Iscritto dal: Sep 2004
Città: Cittadina del Mondo
Messaggi: 10
Quote:
Originariamente inviato da cionci
Una piccola nota rand()%N permette di ottenere interi fra 0 e N-1

Come posso fare per ottenere invece un random decimale, un float compreso tra 0 e 1?
melanippe è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 15:56   #17
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Dipende....hai un numero di decimali prefissato che vuoi ottenere ?

Se non vuoi un numero di decimali prefissato basta dividere per RAND_MAX (è una costante che solitamente identifica il numero massimo positivo rappresentato sugli interi)...

(double)rand() / RAND_MAX

Il risultato è ovviamente un double...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 15:59   #18
Ubi-Wan
Bannato
 
L'Avatar di Ubi-Wan
 
Iscritto dal: Jul 2004
Città: Tatooine
Messaggi: 506
per usare sempre rand puoi fare cosi' per esempio:

float x;

x=(float)(rand()%101)/100.0;

cosi' ottieni un numero decimale compreso tra 0 e 1 con precisione di 2 zeri dopo la virgola
Ubi-Wan è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 16:18   #19
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da cionci
Se non vuoi un numero di decimali prefissato basta dividere per RAND_MAX (è una costante che solitamente identifica il numero massimo positivo rappresentato sugli interi)...

(double)rand() / RAND_MAX
rand genera valori "casuali tra 0 e RAND_MAX inclusi, quindi sarebbe piu' giusto:
Codice:
(double)rand() / (RAND_MAX+1)
che tuttavia potrebbe dare dei problemi di overflow, perche' RAND_MAX+1 ha il tipo di RAND_MAX e potrebbe essere negativo.
Il metodo "esatto" dovrebbe essere questo:
Codice:
(double)rand() / (RAND_MAX+1U)
che e' il rapporto tra un valore double compreso tra 0 e RAND_MAX inclusi, e un valore intero senza segno, quindi sicuramente positivo.
A questo punto, una variabile aleatoria bernoulliana X di parametro p (che vale 1 con probabilita' p, 0 con probabilita' 1-p) si genera semplicemente ponendo:
Codice:
X = ((double)rand() / (RAND_MAX+1U)) < p;
EDIT: ho corretto un RAND (sbagliato) in RAND_MAX(giusto)
__________________
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 : 13-09-2004 alle 16:25.
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 13-09-2004, 16:18   #20
melanippe
Junior Member
 
Iscritto dal: Sep 2004
Città: Cittadina del Mondo
Messaggi: 10
Quote:
Originariamente inviato da Ubi-Wan
per usare sempre rand puoi fare cosi' per esempio:

float x;

x=(float)(rand()%101)/100.0;

cosi' ottieni un numero decimale compreso tra 0 e 1 con precisione di 2 zeri dopo la virgola

Grazie, è quello che cercavo di ottenere, anche se temo di non essermi espressa chiaramente!
melanippe è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
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: 20:18.


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