Aiuto per un utente alle prime armi con c++

di il
7 risposte

Aiuto per un utente alle prime armi con c++

Buongiorno a tutti,
volevo chiedere il vostro aiuto in quanto sono alle prime armi con la programmazione e non riesco ad andare avanti.
Il mio problema è il seguente, provo a semplificarlo illustrandovi cosa dovrebbe fare il mio codice e riportando quanto ho fatto io.
Dovrei creare una funzione che mi permetta di estrarre numeri random con distribuzione exp(-t/T) e verficare poi che gli y stampati abbiano effettivamente la distribuzione richiesta, riporto una sorta di pseudocodice:

float randexp(T) {
produce un random t tra 0 ed infinito con distribuzione exp(-t/T)
......
return t;
}

main program
........
T = numero;
for (.........) {
y = randexp(T)
stampa y
}
..........
fine main

Ora, il codice che io ho scritto è invece il seguente ma c'è un errore che non riesco a correggere, c'è qualcuno che può aiutarmi a capire dove sbaglio? Sono davvero alle prime armi e per quanto mi riguarda ciò che ho scritto potrebbe davvero essere tutto sbagliato.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>


float randexp (float t, int T)    
        {
        t = rand();
        randexp = (-T)*log(t);
        return t;
}

int main()
{
float y ; int i,T;
      
      for(i=0; i<=1000; i++){
      T=2; 
      y = randexp;
      printf("%f\t", y);
     
     }
     
     getch();
       
}   
Spero di essere stato sufficientemente chiaro.Grazie a tutti e scusate il disturbo.

7 Risposte

  • Re: Aiuto per un utente alle prime armi con c++

    
    y = randexp;
    
    Non devi chiamare la funzione quà? Un cosa del tipo:
    
    y = randexp(i,T);
    
  • Re: Aiuto per un utente alle prime armi con c++

    Sky sei diventato moderatore
  • Re: Aiuto per un utente alle prime armi con c++

    skynet ha scritto:


    
    y = randexp;
    
    Non devi chiamare la funzione quà? Un cosa del tipo:
    
    y = randexp(i,T);
    
    In realtà il compilatore mi da errore nella funzione iniziale, ovverosia in questa parte

    float randexp (float t, int T)
    {
    t = rand();
    randexp = (-T)*log(t);
    return t;
    }

    e quindi anche facendo come mi hai consigliato non cambia nulla. Non so proprio dove sbattere la testa...
  • Re: Aiuto per un utente alle prime armi con c++

    Il problema è che non indichi qual'è l'errore e bisogna andare per tentativi. cmq forse intendevi questo:
    
    float randexp (float t, int T)
    {
    t = rand();
    return (-T)*log(t);
    }
    
  • Re: Aiuto per un utente alle prime armi con c++

    skynet ha scritto:


    Il problema è che non indichi qual'è l'errore e bisogna andare per tentativi. cmq forse intendevi questo:
    
    float randexp (float t, int T)
    {
    t = rand();
    return (-T)*log(t);
    }
    
    In effetti non avevo indicato quale fosse l'errore.
    Ho corretto come mi hai detto e ora il programma funziona e anche la distribuzione dei numeri che ho ottenuto è proprio quella che mi serviva.
    Spero di riuscire a proseguire con il mio lavoro, nel caso chiederò ancora aiuto.
    Grazie mille!!!!
  • Re: Aiuto per un utente alle prime armi con c++

    Buongiorno, ritorno per chiedere il vostro aiuto

    Dopo aver implementato una funzione tipo randexp(T,t) che produce
    tempi t distribuiti secondo un epsonenziale con parametro T, adesso ho bisogno di fare un ulteriore passaggio.
    Devo mettere in relazione la vita media di un nucleo padre e di un nucleo figlio in una catena di decadimenti. I tempi di vita dei nuclei sono quelli generati dalla mia funzione randexp (T,t).
    Avendo T_padre vita media del padre, e T_figlio è la vita media del figlio,
    se chiamo randexp(T_padre, t1) ottengo il t1 di vita di un nucleo padre, e se chiamo randexp(T_figlio, t2) ottengo il t2 di vita di un nucleo figlio.
    Se sommo t1+t2 ottengo la vita totale della coppia.
    Ripeto questo passo tutte le N volte che mi serve, e ho prodotto N accoppiate padre+figlio.

    Ho bisogno quindi di sommare i tempi t che ho ottenuto dalla mia funzione. Come posso fare? Ho provato ad utilizzare una semplice somma ma non riesco a sommare 2 valori. Dei 1000 numeri che ho generato devo ottenere le N somme di 2 valori.
    Ho bisogno di creare un array in cui salvare i numeri generati e poi sommarli?
    Il mio codice di partenza è il seguente:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <math.h>


    float randexp (float T, float t)

    {
    t = (rand()*1.0)/RAND_MAX;
    return (-T)*log(t);
    }

    int main()

    {
    float y,t,T ; int i;
    for(i=0; i<1000; i++){

    T=1;
    y = randexp (T,t);
    printf("%f\t", y);

    }

    getch();

    }
  • Re: Aiuto per un utente alle prime armi con c++

    Ciao ^^ ,

    Se ho capito bene potresti chiamare due variabili float. Per ogni ciclo calcoli il tempo del nucleo padre e quello del figlio e poi li sommi , infine , se hai bisogno che vengano salvate le somme allora le inserisci in un array float ( array , lista puntata o quello che vuoi xD ) altrimenti stesso nel ciclo stampi a video la somma.
    Esempio
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <math.h>
    #define N 1000
    
    
    float randexp (float T, float t) 
    {
        t = (rand()*1.0)/RAND_MAX;
        return (-T)*log(t);
    }
    
    int main()
    {
        float tempo_figlio,t,T,tempo_padre , N_accoppiate[N]; 
        int i;
        for(i=0; i<N; i++)
        {
              T=1;
              tempo_padre = randexp (T,t);
              tempo_figlio = randexp (T,t);
              N_accoppiate[i]= tempo_padre+tempo_figlio;
        }
        getch();
    }
    
    Non so se volevi questo ^^

    Distinti Saluti,
    Alessandro
Devi accedere o registrarti per scrivere nel forum
7 risposte