Porting normalvariate from python to C

Seeing as bromer needed a normalvariate function in C for some cluster project at DIKU, I thought it might be a good deal of fun to port it from python. That plus I have no clue what so ever about what the function does.

Without further delay, here is my first C code for a long time.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <math.h>
#include <stdlib.h>
 
#define NV_MAGICCONST 1.7155277699214135 /* (4 * exp(-0.5) / sqrt(2.0)); */
#define MAX_RANDOM 2147483647 /* (2 ** 31) - 1; */
 
/*
 * normalvariate ported from python's stdlib (random.normalvariate).
 * released under the same licence as that (python license).
 *
 * remember to initialize the random engine before calling this function.
 */
double normalvariate(double mu, double sigma) {
	double u1, u2, z, zz;
	for (;;) {
		u1 = ((float)random()) / MAX_RANDOM;
		u2 = 1.0 - (((float)random()) / MAX_RANDOM);
 
		z = NV_MAGICCONST * (u1 - 0.5) / u2;
		zz = z * z / 4.0;
 
		if (zz <= -(log(u2))) {
			break;
		}
	}
 
	return mu + z * sigma;
}

2 thoughts on “Porting normalvariate from python to C

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">