|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jun 2006
Città: Cassina de' Pecchi (MI)
Messaggi: 20
|
La funzione Random
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 Far Star |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Feb 2007
Messaggi: 11
|
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. |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Dec 2006
Città: Genova
Messaggi: 278
|
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!
__________________
"Lei, laggiù in fondo, mi deve ascoltare. Altrimenti io sto qui a parlare ad minchiam" F.Scoglio Stavate_parlando_di_me..... |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2001
Città: U.S.A.
Messaggi: 1359
|
Perhaps, this example..
may help you.
http://members.cox.net/srice1/random/crandom.html
__________________
From Dallas,Texas... Se e' vero che fare la "cacca" e' arte.....allora io ho appena creato un capolavoro! ************************************************************ |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2002
Messaggi: 32713
|
Spostato in programmazione.
__________________
| Front & Rear: Arbour 5.02 | Center: Arbour C.4 | Sub: Arbour S.10 | Ampli: Onkyo TX-SR607 | Video: Panasonic TX-L47DT50 | Recorder: TS-6600HD |
Sorgente Video: Raspberry PI & Openelec + QNAP TS-869L WD Red 4x4TB | Musica Liquida: Squeezebox Touch | Remote Control: Harmony One | |
|
|
|
|
|
#6 |
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16214
|
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Jun 2006
Città: Cassina de' Pecchi (MI)
Messaggi: 20
|
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 |
|
|
|
|
|
#8 |
|
Junior Member
Iscritto dal: Feb 2007
Messaggi: 11
|
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; } |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:48.



















