PDA

View Full Version : La funzione Random


Far Star
26-02-2007, 14:06
Ciao a tutti, mi spieghereste come funziona il random nel linguaggio C?
non riesco a capire come possano essere estratti casualmente dei numeri.....
C'è un algoritmo alla base di tutto ciò?
Grazie:D

Far Star

Claudio M
26-02-2007, 23:15
Non sono un grande esperto, in materia, ma provo a rispondere alla domanda.
I clacolatori non sono in grado di generare numeri casuali nel senso che probabilmente tu hai in mente, come ad esempio il lancio di un dado.
Come hai giustamente intuito ci sono degli algoritmi in grado di tirare fuori sequenze piu' o meno lunghe (anche molto lunghe, anche 2^31) di numeri detti "pseudocasuali" caratterizzate da un numero madre detto "seme" che definisce l'algoritmo. Noto il seme quindi i numeri pseudocasuali sono perfettamente prevedibli, ma se si ignora questo, e immaginando di aver "estratto" l'n esimo numero, per l' n+1 esimo tutti i numeri tra o e 1 sono equiprobabili (come lo sono gli interi tra 1 e 6 nel caso del lancio di un dado).
Di questi algoritmi ce ne sono anche di molto semplici, i congruenziali moltiplicativi sono del tio:

Z_n = res(a*Z_(n-1), m)

dove la successione di numeri interi è Z_n, e dove a, m sono numeri interi che caratterizzano l'algoritmo. res(x,y) è la funzione resto della divisione x/y.

se si divide ogni elemento della successione Z_n per m si ottengono numeri pseudocasuali compresi tra 0 e 1.
L'argomento comunque è molto vasto e molto importante perchè rende possibile le simulazioni al computer. Puoi trovare moltissimo su internet, anche le routine piu' famose, è tutto freeware.

Londo83
27-02-2007, 16:50
di c++ mi ricordo poco ma per tirare fuori numeri casuali mi ricordo che esesteva una funzione che,datogli un valore, ne ricavava un numero.
ovviamente se tu gli imponevi un numero n il risultato era sempre lo stesso quindi al posto di n passavi o un numero sempre maggiore (n++) oppure la "furbata" stava nel passargli l'ora.....diversa ogni volta che si faceva girare il programma!

è un po sommaria come descrizione ma non mi ricordo moltissimo......sorry!

Robert Valerio
27-02-2007, 18:35
may help you.
http://members.cox.net/srice1/random/crandom.html

Kewell
27-02-2007, 20:44
Spostato in programmazione.

Ziosilvio
27-02-2007, 20:56
http://www.hwupgrade.it/forum/showthread.php?t=1196677

Far Star
01-03-2007, 16:51
Grazie a tutti per le risposte!
Come sospettavo non è semplicissimo per uno studentello delle superiori... ma vedrò di capirci lo stesso qualcosa!
ciao!

Far Star

Claudio M
02-03-2007, 01:00
Prova questo codice, per i numeri a ed m ho messo i primi che mi venivano in mente. In teoria andrebbero scelti con cura per far si che il generatore abbia determinate proprieta' .
Ho fatto pure una verifica che il numero sia compreso tra 0 e 1, infatti la media è circa 0.5. Puoi verificare che si avvicina a 0.5 aumentando il numero di iterazioni . Puoi giocare anche sul seme. NB Il cuore del codice l'ho inplementato nelle sole 2 righe della funzione: generaRandom().
Carino no?



#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;

int generaRandom(int a, int m, int n)
{
int n_piu_uno;
n_piu_uno=(a*n) - m*(a*n/m); // funzione resto della divisione tra ;
// (a*n) ed m ; Z_nres(a*Z_(n-1), m);
return n_piu_uno;
}


int main()
{
int a=2345;
int m=253256;
int nIterazioni=100;
double x;
int prossimo;
int n;
int seme=87432;

n=seme;
double somma=0;
for (int i=0; i<nIterazioni; i++)
{
prossimo=generaRandom(a, m, n);
double reale=double(prossimo)/double(m); //è compreso tra 0 e 1;

cout<<"iterazione: "<<i+1<<" intero estratto= "<<prossimo<<
" reale = "<<reale<<endl;
n=prossimo;

somma=somma+reale;

}
double media=double(somma)/double(nIterazioni);
cout<<"media= "<<media;
system("PAUSE");
return EXIT_SUCCESS;
}