random.h is a header only random number generation library for games, image processing and procedural content generation.

A few years back I wrote some handy floating point random number generation routines for a raytracer. Time and again, I have needed these routines for other programs I have been working on. It seems like a good idea to wrap them up in a small header and release them in the public domain for others to use too.

Each RNG function takes an 64bit integer as a seed value and permutes it in place. The resulting bits are used for the generation of the result. I like this design as it keeps the RNG functions stateless and thread safe. You just have to keep track of the uint64_t you have been using as your RNG stream.

Included are various 1, 2 and 3 dimentional random number generators with a range of different distributions.

Triangular random noise is very usefull when dithering audio and images during the process of bitdepth conversion. Typicaly, triangular noise is added to the signal immediately before type casting (at the same magnitude as the LSB of the destination bit depth).

The 2d and 3d vector RNG functions generate statisticaly unbiased vectors inside and on the unit circle or sphere (Generating vectors by randomizing the components and normalizing would bias the vector to the corners of unit cube). I have used these functions successfully in the past for generating ambient occlusion maps.

I wrote a little program to generate some images to display the output distribution of each function. A 3d point is generated by filling its component from the RNG function under test, and the resulting point is projected in space, as well as projected on each component axis (the red, blue and green planes). Hopefully the images help a little to convey the distribution of each function.

Again, you can find the library here:

random.h

randfu() - unsigned random range [0,1]

randfs() - signed random range [-1,+1]

trandfs() - triangular random range[-1,+1], tends to 0

grandfs() - gaussian random range ~[-1,+1], tends to 0

vrand3d() - 3d vector random magnitude range: [0, 1]

nvrand3d() - normalized 3d vector random magnitude = 1

vrand2d() - 2d vector random magnitude range: [0,1]

nvrand2d() - normalized 2d vector random magnitude = 1