Generatore di numeri casuali

di il
19 risposte

Generatore di numeri casuali

Salve a tutti.. sono nuovo di qui e sono nuovo anche nel linguaggio c++.

Avrei bisogno di imparare un metodo per generare numeri casuali distribuiti tra 0 e 1.

e implementarne un altro secondo un esponenziale negativa.

Da quanto ho capito il metodo della cumulante é il più affidabile ma non so da dove partire per

implementarlo con c++!!!! cioè so che devo calcolare l'integrale ad esempio dell'esponenziale negativa

dividendo in piccoli trattini discreti l'asse x e creare quindi la funzione integrale... e poi?

C'è qualcuno che mi puo' dare una mano?

grazie in anticipo

19 Risposte

  • Re: Generatore di numeri casuali

    Per generare numeri casuali compresi fra 0 e 1 e sufficiente scrivere il seguente codice

    srand(time(0));
    tua_variabile=rand()%1;

    la seconda parte spiegati meglio perchè non l'ho proprio capita...
  • Re: Generatore di numeri casuali

    Ciao! grazie della risposta, meglio forse risolvere i problemi uno per volta: prendiamo il primo.

    ho provato secondo il tuo suggerimento a costruire il programma:

    #include <ctime>
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>

    using namespace std;

    int main()
    {
    int i,n;
    double k;
    cout << " inserire quanti numeri casuali vuoi: " ;
    cin >> n;

    srand(time(0));

    for(i=0;i<n;i++)
    {
    k = rand()%1;
    }
    cout<< "i numeri casuali richiesti sono: "<< k;

    system ("pause");

    return(0);
    }


    l'output del programma è zero!! perchè? quale errore ho fatto nel codice?

    in pratica io voglio come output n(numero che gli do io) numeri casuali che siano reali tra 0 e 1.

    grazie per l'aiuto!
  • Re: Generatore di numeri casuali

    Hai fatto un grave errore nel ciclo for, quando ti genera i numeri casuali tu li metti sempre nella solita variabile k, invece devi metterli in un vettore, come segue:

    int main()
    {
    int i,n;
    int vett[100];
    cout << "Inserire quanti numeri casuali vuoi (compresi fra 1 e 100): " ;
    cin >> n;

    srand(time(0));

    for(i=0;i<n;i++)
    {
    vett = rand()%1;
    }
    cout<< "i numeri casuali richiesti sono: "<<endl;

    for (i=0;i<n;i++)
    {
    cin>>vett<<" ";
    }

    system ("pause");
    return EXIT_SUCCESS;
    }
  • Re: Generatore di numeri casuali

    OK! è vero non posso passargli una variabile!!

    però ho un problema nella compilazione adesso:

    cin >>vett<<" "; questo comando mi genera il seguente errore: no match for 'operator<<' in ' (&std::cin)->std::basic_istream<_CharT, _Traits>::operator>>(int&) [with

    e un altra domanda...dopo che hai scritto il primo ciclo for hai gia' generato i nuemeri casuali che vuoi giusto? perchè per fargli stampare utilizzi un altro for?

    perchè non basterebbe scrivere alla fine del primo ciclo for:

    cout<< "i numeri casuali richiesti sono: "<<vett;??

    grazie

    ciao!
  • Re: Generatore di numeri casuali

    Si, ho sbagliato io...
    prova così:

    cout<< "I numeri casuali richiesti sono: "<<endl;

    for (i=0;i<n;i++)
    {
    cout<<vett<<" ";
    }


    si! hai già generato i numeri richiesto, ma sono in un vettore, e se fai solo vett, ti sstamperebbe solo un numero casuale, quello di posizione i, percui devi riscorrere tutto il vettore e man mano fargli scrivere a video (con il cout) i valori....
  • Re: Generatore di numeri casuali

    Afferrato!

    ok ora il problema è: come output mi vengono tutti zeri!! cioè tanti quanto è n che gli do'..

    è possibile che debba definire qualche variabile che non sia di tipo int?

    grazie per la pazienza!
  • Re: Generatore di numeri casuali

    Prova così....:

    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    #include <cstdio>

    using namespace std;

    int main(int argc, char *argv[])
    {
    int i,n;
    int vett;
    cout << "Inserire quanti numeri casuali vuoi: " ;
    cin >> n;

    srand(time(0));

    for(i=0;i<n;i++)
    {
    vett = rand()%2;
    }
    cout<< "I numeri casuali richiesti sono: ";

    for(i=0;i<n;i++)
    {
    cout<<vett<<" ";
    }

    system("PAUSE");
    return EXIT_SUCCESS;
    }


    ADESSO DOVREBBE PROPRIO ANDARE (comunque guarda che erano già stati aperti dei forum in merito al random in c++...)
  • Re: Generatore di numeri casuali

    Mah! non finisce mai di stupirmi questo computer! adesso mi compila il

    programma...ma mi da un errore in fase di avvio della console!!

    forse è un problema del dev c++ che non risconosce qualche comando:

    tipo: argc, char *argv[] nel main! non sapevo neanche che esistesse...cosa vuol

    dire?

    ciao! arigrazie!!
  • Re: Generatore di numeri casuali

    Ho testato il programmino che ti ho mandato e a me funziona...

    prova a scaricare "dev c++ blodsheet setup 4.9.9.2"........è probabile che si tratti di un errore del tuo c++

    nel main argc, char *argv[] puoi anche toglierli, (in questo caso).
    -argc: è un intero che contiene il numero di argomenti che sui trovano sulla "linea di comando"
    -*argv[] è un puntatore a un array di puntatori di caratteri, cioè ogni elemento di questo array punta a ogni parametro presente sulla "riga di comando".

    se hai problemi fammi sapere: il codice che ti ho fornito però sono sicuro che funziona perchè l'ho testato...
  • Re: Generatore di numeri casuali

    Ok! il codice ora funziona! ma quello che in realtà voglio in output è una cosa di questo genere

    0.69867227 0.94218740 0.03427201 0.78842173 0.28180608
    0.92179002 0.20785655 0.54534773 0.69644020 0.38107718
    0.23978165 0.65286910 0.07514568 0.22765211 0.94872929
    0.74557914 0.62664415 0.54708246 0.90959343 0.42043116
    0.86334511 0.19189126 0.14718544 0.70259889 0.63426346
    0.77408121 0.04531601 0.04605807 0.88595519 0.69398270
    0.05377184 0.61711170 0.05565708 0.10133577 0.41500776
    0.91810699 0.22320679 0.23353705 0.92871862 0.98897234
    0.19786706 0.80558809 0.06961067 0.55840445

    cioè numeri casuali reali e non interi!

    invece l'output di questo programma mi da 0 1 0 0 1 ecc.

    ho pensato a queste due cose:

    1 dovrei dichiarare il vettore come un float e non come un int

    2 forse la funzione rand() non funziona per questo tipo di numeri casuali e dovrei quidi cambiare algoritmo.
  • Re: Generatore di numeri casuali

    #include <cstdlib>
    #include <iostream>
    #include <ctime>
    #include <cstdio>

    using namespace std;

    int main(int argc, char *argv[])
    {
    int i,n;
    double vett;
    cout << "Inserire quanti numeri casuali vuoi: " ;
    cin >> n;

    srand(time(0));

    for(i=0;i<n;i++)
    {
    vett = rand()/(double(RAND_MAX)+1);

    }
    cout<< "I numeri casuali richiesti sono: ";

    for(i=0;i<n;i++)
    {
    cout<<vett<<" ";
    }

    system("PAUSE");
    return EXIT_SUCCESS;
    }

    nno ho fatto altro che mettere il vettore di double e caricargli man mano un random fra 0 e 1 double, con una funzione chiamata RAND_MAX.
    adesso va bene???
  • Re: Generatore di numeri casuali

    Funziona! GRAZIE !

    un ultima domanda... ma RAND_MAX + 1 come funziona quel comando? cioè rand()/(double(RAND_MAX)+1) significa che prende ogni numero generato

    casualmente dalla rand e lo divide per il massimo tra quei numeri che genera ad ogni passo incrementato di uno? è questo il senso?

    ciao!
  • Re: Generatore di numeri casuali

    RAND_MAX genera un numero casuale double compreso fra o e 1, poi gli somma il massimo (in questo caso 1) e fa da divisore al numero generato da rand().
  • Re: Generatore di numeri casuali

    Perfetto!

    grazie mille!

    ciao!!
Devi accedere o registrarti per scrivere nel forum
19 risposte