In: Computer Science
Program a code for the random variable (Exponential distribution), where the user informs the data and parameters necessary to generate the Probability Density function (PDF) and the Cumulative Distribution Function (CDF).
The formula for exponential distribution is given below
Here is the probability density function.
The program to generate exponential distribution is given below
#include <stdio.h> // Needed for printf()
#include <stdlib.h> // Needed for exit() and ato*()
#include <math.h> // Needed for log()
//----- Function prototypes -------------------------------------------------
double expon(double x); // Returns an exponential random variable
double rand_val(int seed);
//===== Main program ========================================================
void main(void)
{
char in_string[256]; // Input string
FILE *fp; // File pointer to output file
double lambda; // Mean rate
double exp_rv; // Exponential random variable
int num_values; // Number of values
int i; // Loop counter
// Output banner
printf("----------------------------------------- genexp.c ----- \n");
printf("- Program to generate exponential random variables - \n");
printf("-------------------------------------------------------- \n");
// Prompt for output filename and then create/open the file
printf("Output file name ===================================> ");
scanf("%s", in_string);
fp = fopen(in_string, "w");
if (fp == NULL)
{
printf("ERROR in creating output file (%s) \n", in_string);
exit(1);
}
// Prompt for random number seed and then use it
printf("Random number seed (greater than 0) ================> ");
scanf("%s", in_string);
rand_val((int) atoi(in_string));
// Prompt for rate (lambda)
printf("Rate parameter (lambda) ============================> ");
scanf("%s", in_string);
lambda = atof(in_string);
// Prompt for number of values to generate
printf("Number of values to generate =======================> ");
scanf("%s", in_string);
num_values = atoi(in_string);
// Output message and generate interarrival times
printf("-------------------------------------------------------- \n");
printf("- Generating samples to file - \n");
printf("-------------------------------------------------------- \n");
// Generate and output exponential random variables
for (i=0; i<num_values; i++)
{
exp_rv = expon(1.0 / lambda);
fprintf(fp, "%f \n", exp_rv);
}
// Output message and close the output file
printf("-------------------------------------------------------- \n");
printf("- Done! \n");
printf("-------------------------------------------------------- \n");
fclose(fp);
}
//===========================================================================
//= Function to generate exponentially distributed random variables =
//= - Input: Mean value of distribution =
//= - Output: Returns with exponentially distributed random variable =
//===========================================================================
double expon(double x)
{
double z; // Uniform random number (0 < z < 1)
double exp_value; // Computed exponential value to be returned
// Pull a uniform random number (0 < z < 1)
do
{
z = rand_val(0);
}
while ((z == 0) || (z == 1));
// Compute exponential random variable using inversion method
exp_value = -x * log(z);
return(exp_value);
}
double rand_val(int seed)
{
const long a = 16807; // Multiplier
const long m = 2147483647; // Modulus
const long q = 127773; // m div a
const long r = 2836; // m mod a
static long x; // Random int value
long x_div_q; // x divided by q
long x_mod_q; // x modulo q
long x_new; // New x value
// Set the seed if argument is non-zero and then return zero
if (seed > 0)
{
x = seed;
return(0.0);
}
// RNG using integer arithmetic
x_div_q = x / q;
x_mod_q = x % q;
x_new = (a * x_mod_q) - (r * x_div_q);
if (x_new > 0)
x = x_new;
else
x = x_new + m;
// Return a random value between 0.0 and 1.0
return((double) x / m);
}
Here you will enter the lambda parameter and get upto 5 values in the output file provided by you.