PDA

View Full Version : [dev c++] generare numeri random


-Ivan-
24-02-2005, 17:29
Scusate ma la ricerca non funziona e anche se sicuramente sarà stato chiesto altre volte mi potete dire qual'è la funzione per generare numeri casuali e quale libreria la include?
Grazie.

StErMiNeiToR
24-02-2005, 17:34
Librerie:

time.h
stdlib.h
[non ricordo se ci vuole la srand.h]

metodo:
srand((unsigned)time(NULL));
int h
h = rand();

-Ivan-
24-02-2005, 18:51
Grazie, mi sai dire anche come posso dirgli di generarne uno tra 0 e 100 per esempio?

Fenomeno85
24-02-2005, 18:58
h = rand ()%101;

~§~ Sempre E Solo Lei ~§~

VegetaSSJ5
24-02-2005, 19:18
Originariamente inviato da StErMiNeiToR
srand((unsigned)time(NULL));
questo devi farlo una volta sola in tutto il programma, non metterlo in un ciclo for...

-Ivan-
24-02-2005, 19:29
Originariamente inviato da VegetaSSJ5
questo devi farlo una volta sola in tutto il programma, non metterlo in un ciclo for...

Beccato, l'avevo messo proprio in un for.
Grazie a tutti.

VegetaSSJ5
24-02-2005, 19:53
Originariamente inviato da -Ivan-
Beccato, l'avevo messo proprio in un for.
Grazie a tutti.
:ahahah:

StErMiNeiToR
24-02-2005, 23:04
auahauahauahuahau :D

-Ivan-
25-02-2005, 16:02
Leggendo qualcosa in giro su internet ho sentito che la funzione di cui parlavi è legata ai secondi dell'orologio, quindi se si inserisce in un ciclo for per avere 10 numeri casuali si avranno 10 numeri casuali uguali, almeno così ho letto.
Me lo confermate?
Ho letto che un altro modo può essere questo:
numero = 0||1||2
un attimino rudimentale, ma se funziona mi può stare bene.
Cosa mi dite?

VegetaSSJ5
25-02-2005, 17:26
Originariamente inviato da -Ivan-
Leggendo qualcosa in giro su internet ho sentito che la funzione di cui parlavi è legata ai secondi dell'orologio, quindi se si inserisce in un ciclo for per avere 10 numeri casuali si avranno 10 numeri casuali uguali, almeno così ho letto.
Me lo confermate?
se il for contiene poche istruzioni e deve essere iterato poche volte allora quello che dici mi sembra ovvio (almeno sulle cpu moderne) in quanto la cpu esegue tutto talmente velocemente che l'orologio di sistema non viene incrementato in quel lasso di tempo e quindi la funzione time ritorna sempre lo stesso valore e di conseguenza la srand imposterà il seme per generare i numeri sempre allo stesso valore.

-Ivan-
25-02-2005, 21:01
Porc... proprio quello che temevo, e non c'è una funzione che generi numeri casuali in altro modo?
Io devo generare per lo più numeri da 0 a 100, come posso farlo senza dover forzare dei ritardi?
Non riesco a capire come generi questi numeri basandosi sui secondi, mi sembrava più ovvio che lo facesse con i micro almeno.

VegetaSSJ5
25-02-2005, 22:03
allora dovresti informarti su come funziona la funzione rand().
in pratica la rand() produce dei numeri pseudocasuali compresi tra 0 e RAND_MAX (che è una costante definita in stdlib.h credo). per generare il numero la funzione legge un valore detto seme. quando genera il numero la rand() cambia il valore del seme impostandolo al valore generato, questo fa sì che la sequenza di numeri "sembri" casuale. per inizializzare il seme si usa la funzione srand() tuttavia se io in un programma passo come parametro alla srand un numero costante (es. srand(5)) ogni volta che il programma verrà eseguito questo produrrà sempre la stessa sequenza di numeri casuali. quindi bisogna cercare un modo per impostare il seme ad un valore casuale e questo si fa proprio passando a srand() come parametro il valore restituito dalla time(). penso che ti abbia chiarito un po' le idee.

fracarro
21-03-2005, 21:45
io ho lo stesso problema nella generazione di numeri casuali in cicli a causa di una esecuzione troppo veloce. Ora, dopo aver letto nei vari post come funziona la rand() mi è rimasto questo dubbio.
la srand genera il seme dal quale la rand genererà la sequenza pseudocasuale, per esempio supponiamo che con il seme a 5 la sequenza pseudo casuale sia : 3,7,15,21,23,.........
E' chiaro che se il seme è sempre lo stesso, ad ogni esecuzione del programma si otterrà sempre la stessa sequenza pseudocasuale. Tuttavia, se invoco tre volte di seguito la funzione rand quest'ultima non dovrebbe restituirmi 3,7,15 (scegliere i primi tre numeri della famosa lista casuale)? Invece nel ciclo viene sempre scelto 3 come mai?
Cosa c'entra l'orologio di sistema nella scelta dei numeri della sequenza pseudocasuale?

The3DProgrammer
21-03-2005, 22:57
una soluzione un po estrema:


int GetSeed(){

int seme;

__asm{

rdtsc;

mov seme,eax;

}

return seme;

}




questo ovviamente se avete bisogno di cambiare seme in un tempo < 1sec (la risoluzione di time() se nn ricordo male)

ciauz

VegetaSSJ5
22-03-2005, 09:16
cosa fa l'istruzione rdtsc?

The3DProgrammer
22-03-2005, 09:47
legge il timestamp counter.

Il timestamp counter è un MSR ( Model specific register) a 64 bit il cui contenuto viene incrementato di 1 ogni ciclo di clock. rdtsc copia i 64 bit dell'MSR in EDX:EAX.


ciauz

NikyRipy
03-02-2009, 20:38
ciao ragazzi vorrei generare 6 numeri casuali compresi da 1 a 90 come posso scrivere il mio algoritmo in c++?

Sto cercando su internet ma non ho trovato granchè...

Aiutatemi please :)