Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema Simulación

Estas en el tema de Problema Simulación en el foro de C/C++ en Foros del Web. Bueno, el detale es este. Tengo que usar Montecarlo en una simulacion que genera numeros random distribuidos Uniforme(0,1), esto lo hago dividiendo el numero aleatorios ...
  #1 (permalink)  
Antiguo 27/08/2013, 21:24
 
Fecha de Ingreso: abril-2012
Mensajes: 2
Antigüedad: 12 años, 7 meses
Puntos: 0
Pregunta Problema Simulación

Bueno, el detale es este. Tengo que usar Montecarlo en una simulacion que genera numeros random distribuidos Uniforme(0,1), esto lo hago dividiendo el numero aleatorios mas grande de c++ (RAND_MAX) entre el rand().

EL problema en si es el output, no me evalúa bien las cosas. Les pongo lo que he hecho:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4.  
  5. using namespace std;
  6.  
  7. double func_esperanza(double y)
  8. {
  9.     double f=0;
  10.     if (y>200) {
  11.         f=y*10-200*5-2*(y-200);                            //si hay mas demanda que 200
  12.     }
  13.     else {
  14.         f=y*10-200*5+.5*(200-y);                           //hay menos demanda que 200
  15.     }
  16.     return f;
  17. }
  18.  
  19. double define_dato(double aux)
  20. {
  21.     double y;
  22.    
  23.     if ((aux>0) && (aux<=(45/300)))
  24.     {
  25.         y=100;
  26.     }
  27.     else if ((aux>(45/300)) && (aux<=(95/300)))
  28.     {
  29.         y=150;
  30.     }
  31.     else if ((aux>(95/300)) && aux<=((155/300)))
  32.     {
  33.         y=175;
  34.     }
  35.     else if ((aux>(155/300)) && (aux<=(215/300)))
  36.     {
  37.         y=200;
  38.     }
  39.     else if ((aux>(215/300)) && (aux<=(270/300)))
  40.     {
  41.         y=250;
  42.     }
  43.     else if ((aux>(270/300)) && (aux<=(1)))
  44.     {
  45.         y=300;
  46.     }
  47.     else
  48.     {
  49.         y=0;
  50.     }
  51.    
  52.     return y;
  53.    
  54. }
  55.  
  56.  
  57.  
  58. double genera_dato()
  59. {
  60.     double R=RAND_MAX;                          //genero los aleatorios uniforme(0,1)
  61.     double dato=rand()/R;                       //divido el mas grande aleatorio / rand()
  62.     return dato;
  63. }
  64.  
  65.  
  66.  
  67. int main()
  68. {
  69.     srand((unsigned)time(0));
  70.     double aux,aux1,p=0;
  71.     double suma=0;
  72.     for (int i=0; i<10; i++) {
  73.         aux= genera_dato();                             //genero el numero random
  74.         cout<<aux<<endl;
  75.         aux1= define_dato(aux);                         //lo evaluo en que intervalo cae
  76.         cout<<aux1<<endl;
  77.         p=func_esperanza(aux1);                         //calculo su esperanza
  78.         cout<<p<<endl;
  79.         suma+=p;
  80.         aux=0;
  81.         aux1=0;
  82.         p=0;
  83.     }
  84.    
  85.     cout<<suma/10;                                      //aplico montecarlo
  86.     return 0;              
  87. }

Este es el output que me ha salido:

0.0765
300
1800
0.736337
300
1800
0.623635
300
1800
0.43767
300
1800
0.914628
300
1800
0.153492
300
1800
0.737618
300
1800
0.149986
300
1800
0.80858
300
1800
0.797272
300
1800
1800

Cabe mencionar que uso Xcode(Mac, Mountain Lion). ¿Alguna sugerencia?
  #2 (permalink)  
Antiguo 28/08/2013, 02:22
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 6 meses
Puntos: 73
Respuesta: Problema Simulación

Una cosa que veo que puede dar problemas son las comparaciones con aux que haces en la función define_dato. En la primera comparación:

if ((aux>0) && (aux<=(45/300)))

estás comparando aux (definida como double) con 95/300. Esta última expresión, al ser una operación entre constantes, se va a evaluar como división entera en tiempo de copmpilación, ya que ninguno de los operandos tiene punto decimal. Por tanto, 95/300 da cociente 0. Lo mismo ocurre en el resto de comparaciones que estás haciendo con aux en esa función. Prueba poniendo un punto decimal en, al menos, uno de los elementos (numerador o denominador) del cociente que comparas con aux, es decir, bastaría con poner, por ejemplo,

if ((aux>0) && (aux<=(45./300)))

con lo que ya obligas al compilador a evaluar ese cociente en coma flotante y no como entero.

Una sugerencia: En las constantes que vayas a utilizar en expresiones en coma flotante, pon siempre el punto decimal al final aunque sean valores enteros. Por ejemplo, en lugar de 5, pon 5. o, mejor aún, por legibilidad, pon 5.0

Prueba cambiando esto que te he comentado, y si sigue habiendo problemas ya buscaremos la causa del fallo.

Saludos,

Etiquetas: c++, simulacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:00.