Generando números aleatorios de distribución exponencial.

#include  #include  #include  double ran_expo(lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } 

Estoy usando esto (no pongo otras partes de los códigos aquí) para generar números aleatorios de una distribución exponencial lambda = 0.05 . (La función de densidad de probabilidad es lambda * exp(-lambda * x) ).

Sin embargo, siempre obtengo números muy pequeños, como 0.000041 , o algo así como 1.#INF00 (¿qué es esto?).

De hecho, para la distribución exponencial con lambda = 0.05 , los números generados deben ser bastante grandes, es decir, la mayoría no está muy lejos de 30. Mis resultados son muy extraños. Además, el grado de precisión no es satisfactorio, solo hasta 10 ^ (- 6). Intenté long double , pero sigue siendo así.

Estoy utilizando DEV C ++ en Windows.

Esto se debe a que no declaró el tipo para lambda , habiendo corregido que los resultados están en el rango que busca. Si no se declara, los comstackdores antiguos asumirán que es int .

 #include  #include  #include  #include  double ran_expo(double lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } int main(void) { int i; srand((unsigned)time(NULL)); for (i=0; i<20; i++) printf("%f\n", ran_expo(0.05)); return 0; } 

Salida del progtwig:

 0.025040 16.582459 4.296027 33.079902 17.589123 13.073084 8.624299 45.254803 34.611211 27.454302 3.825699 39.168172 24.790600 14.411160 7.247698 0.301951 1.917010 9.065004 3.187146 3.627885 

Tiré tu código textualmente en el código chef , parece que funciona bien. El comstackdor es gcc c ++ 4.9.2. Este código imprime 36.6751 :

 #include  #include  #include  #include  using namespace std; double ran_expo(double lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } int main() { cout << ran_expo(0.05); return 0; } 

Funciona de la misma manera en C, también (de nuevo, gcc 4.9.2):

 #include  #include  double ran_expo(double lambda){ double u; u = rand() / (RAND_MAX + 1.0); return -log(1- u) / lambda; } int main() { printf("%f\n", ran_expo(0.05)); return 0; } 

Debe ser tu comstackdor / libreria?