n° 186
Luglio/Agosto 2013
Giugno 20, 2013, 10:30:39 am *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [C] Valori reali pseudorandom in [0, 1]  (Letto 741 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
Lucia92
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 11


Mostra profilo E-mail
« inserita:: Agosto 15, 2012, 08:43:28 pm »

Scrivere una procedura che, data un'ascissa x, calcoli la seguente funzione matematica: (x^3+3x+5)/(8x+1). Scrivere successivamente un programma che calcoli e
 visualizzi il risultato della funzione in 20 ascisse casuali scelte nell'intervallo [0,1].

L'esercizio è questo in pratica, in linguaggio C, l'ho svolto ma non riesco ancora a capire una cosa.. mi chiede la funzione in 20 ascisse casuali scelte nell'intervallo [0,1]... Come è possibile una funzione random simile? Dovrebbe darmi in output numeri tipo 0.0001 e simili, ma come si fa?
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +205/-15
Scollegato Scollegato

Messaggi: 2709


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #1 inserita:: Agosto 15, 2012, 09:02:38 pm »

Proponi il codice che hai prodotto, e discuteremo assieme le modifiche necessarie.

Per intanto, sappi che il principio è estremamente semplice: il generatore pseudorandom della libreria standard C genera, in condizioni normali, RAND_MAX valori. Dunque è sufficiente dividere il valore pseudocasuale di volta in volta ottenuto per tale quantità, con un cast a float o double, per ottenere una approssimazione grezza ma efficace di estrazione pseudo-random nell'intervallo reale desiderato.

Codice:
/************************************************************************/
/**                                                                    **/
/** Esempio elementare di generazione di valori float pseudocasuali.   **/
/**                                                                    **/
/************************************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define A_SIZE  8

main()
{
    int i;
   
    srand(time(NULL));

    printf("Generazione di %d valori float "
           "pseudo-casuali nell'intervallo [0, 1].\n",
           A_SIZE);
   
    for (i = 0; i < A_SIZE; i++)
    {
        float rn = (float)rand() / (float)RAND_MAX;
        printf("%d) %.06f\n", i, rn);
    }
   
    return (0);
}

/* EOF: rnd_flt.c */
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
Lucia92
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 11


Mostra profilo E-mail
« Risposta #2 inserita:: Agosto 16, 2012, 11:17:56 am »

Si, scusa! Comunque non mi è ancora chiara purtroppo la cosa, ho provato come dici tu e mi da valori int.. boh! Mi serve ancora un po' di esercitazione..

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void matematica(float x);

void main ()
{
    int i;
    float x,a=0, b=1;

    srand(time(NULL));
    for(i=1;i<=20;i++)
    {
        x= //Qui dovrebbe esserci la rand
        matematica(x);
        printf("\nLa %da equazione e':\n", i);
        printf("%f\n",x);
    }


}

void matematica(float x)
{
    float soluzione;

    soluzione=(pow(x,3)+(3*x)+5)/((8*x)+1);
}
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +205/-15
Scollegato Scollegato

Messaggi: 2709


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #3 inserita:: Agosto 16, 2012, 02:50:59 pm »

Il tuo codice presenta numerosi errori. In particolare, la funzione che calcola il valore puntuale della funzioncina matematica assegnata dovrebbe certamente restituire al chiamante tale valore float.
Senza entrare troppo nel merito del calcolo, che andrebbe rivisto in modo da minimizzare gli errori di troncamento e arrotondamento, sottolineo che tutte le costanti dovrebbero quantomeno essere espresse come float, come evidenziato nel seguente esempio.

Propongo una possibile soluzione, che analizzerai in ogni sua parte cercando di comprendere gli errori concettuali fin qui commessi.

Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

float matematica(float x);

void main ()
{
    int i;
    float x, sol;

    srand(time(NULL));
   
    for(i = 0; i <20; ++i)
    {
        x = (float)rand() / (float)RAND_MAX;
        sol = matematica(x);
        printf("%2d) per x = %.4f si ha %.4f\n", i, x, sol);
    }


}

float matematica(float x)
{
    /*
    ** Ovviamente questa variabile è del tutto ridondante,
    ** ma scolasticamente ha molto senso esplicitarla.
    */
    float soluzione;

    soluzione = (pow(x, 3.0) + (3.0 * x) + 5.0) / ((8.0 * x) + 1.0);
   
    return(soluzione);
}
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
Lucia92
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 11


Mostra profilo E-mail
« Risposta #4 inserita:: Agosto 17, 2012, 12:25:18 pm »

Mmmm scusa gli errori, ma non sono ancora molto brava..
Però devo correggerti su una cosa, l'esercizio mi ha espressamente chiesto una procedura, quindi senza return, non una funzione...

Comunque grazie per avermi corretto, modifico subito!
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +205/-15
Scollegato Scollegato

Messaggi: 2709


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #5 inserita:: Agosto 17, 2012, 01:43:38 pm »

Mmmm scusa gli errori, ma non sono ancora molto brava..

Se tu fossi "brava" non avresti necessità di ricorrere al forum (se non per argomenti di altra complessità), dunque non occorre scusarsi.


Però devo correggerti su una cosa, l'esercizio mi ha espressamente chiesto una procedura, quindi senza return, non una funzione...

Ma ragazza mia, questo vincolo avrebbe dovuto essere specificato subito... Ghigno
Se per specifica non puoi restituire il valore atteso, ci si attende che tu trovi il modo per:

a) utilizzarlo direttamente in seno alla procedura stessa (è sufficiente spostare banalmente la printf()), o alternativamente

b) restituirlo indirettamente, usando una delle tecniche più idonee (tipicamente un puntatore).
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
Lucia92
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 11


Mostra profilo E-mail
« Risposta #6 inserita:: Settembre 19, 2012, 05:44:40 pm »

Grazie! Mi sei stato veramente di grande aiuto!!!  Felice
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page