/****************************************************************************** Module Name : random.h Module Date : 02/26/2014 Module Auth : Yonggang Li, ygli@theory.issp.ac.cn Description : Others : Refers to Corteo. Revision History: Date Rel Ver. Notes ******************************************************************************/ #include "random.h" /*============================================================================= Function Name : randomx Description : Random function from P. L'Ecuyer, Communications of the ACM 31 (1988) 742. Inputs : no. Outputs : no. Notes : Corteo: Adapted from randomx.c. =============================================================================*/ double randomx (void) { int z, k; k = seed1 / 53668; seed1 = 40014 * (seed1 - k * 53668) - k * 12211; if (seed1 < 0) seed1 = seed1 + 2147483563; k = seed2 / 52774; seed2 = 40692 * (seed2 - k * 52774) - k * 3791; if (seed2 < 0) seed2 = seed2 + 2147483399; z = seed1 - seed2; if (z < 1) z = z + 2147483562; return z * 4.65661305956E-10; } /*============================================================================= Function Name : compute_lists Description : Generate and randomize lists random_list, sqrt_log_list, sin_azim_angle & cos_azim_angle. Inputs : no. Outputs : no. Notes : Corteo: Functions adapted from corteo.c. Function call: fromcorteo - void randomize_list (float *list, unsigned int max_list); float sqrtdf (double val); float d2f (double val). =============================================================================*/ void compute_lists (void) { unsigned int irandom_list, ilog_list, iazim_angle, iran_mu; float yu, mu; /* generate a uniformly spaced list of values between .5/MAXRANLIST and 1-.5/MAXRANLIST */ for (irandom_list=0; irandom_list sigma*x + mean_x */ for (irandom_list=0; irandom_list log_list */ log_list[ilog_list] = - log ((ilog_list + .5) / MAXLOGLIST); randomize_list (log_list, MAXLOGLIST); /* put the list in random order */ /* pre-compute 1/sqrtloglist[] */ for (ilog_list=0; ilog_list log_list */ inv_sqrt_log_list[ilog_list] = 1.0f / sqrtdf (log_list[ilog_list]); /* produce a list uniformly distributed but randomly ordered azimuthal angles */ for (iazim_angle=0; iazim_angle