Skip to content

Commit cfeb97f

Browse files
committed
Add prng refs
1 parent f3bc874 commit cfeb97f

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

TODO.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,6 +1218,8 @@ TODO
12181218
12191219
250. [chunkify](https://github.com/compute-io/chunkify), [buffer](https://www.mathworks.com/help/signal/ref/buffer.html), [split](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.split.html), [splitVec](https://www.mathworks.com/matlabcentral/fileexchange/24255-consecutive-vector-spliter/content/SplitVec.m)
12201220
1221+
251. [random123](http://www.deshawresearch.com/downloads/download_random123.cgi/)
1222+
12211223
12221224
12231225
---

docs/references/bib.bib

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,3 +356,106 @@ @article{thomas:2007
356356
volume = {39},
357357
year = {2007},
358358
}
359+
360+
@article{marsaglia:2000a,
361+
abstract = {We offer a procedure for generating a gamma variate as the cube of a suitably scaled normal variate. It is fast and simple, assuming one has a fast way to generate normal variables. In brief: generate a normal variate \\(x\\) and a uniform variate \\(U\\) until \\(\ln(U) < 0.5 + d - dv + \ln(v)\\), then return \\(dv\\). Here, the gamma parameter is \\(\alpha \geq 1\\), and \\(v = (1 + x/ *** with \\(d = \alpha - 1/3\\). The efficiency is high, exceeding \\(0.951, 0.981, 0.992, 0.996\\) at \\(\alpha = 1,2,4,8\\). The procedure can be made to run faster by means of a simple squeeze that avoids the two logarithms most of the time; return \\(dv\\) if \\(U < 1 - 0.0331\\). We give a short C program for any \\(\alpha \geq 1\\), and show how to boost an \\(\alpha \lt 1\\) into an \\(\alpha \gt 1\\). The gamma procedure is particularly fast for C implementation if the normal variate is generated in-line, via the #define feature. We include such an inline version, based on our ziggurat method. With it, and an inline uniform generator, gamma variates can be produced in 400MHz CPUs at better than 1.3 million per second, with the parameter \\(\alpha\\) changing from call to call.},
362+
acmid = {358414},
363+
address = {New York, NY, USA},
364+
author = {George Marsaglia and Wai Wan Tsang},
365+
doi = {10.1145/358407.358414},
366+
issue_date = {Sept. 2000},
367+
journal = {ACM Transactions on Mathematical Software},
368+
keywords = {gamma distribution, random number generation, ziggurat method, random, prng, rng, pseudorandom, gamma},
369+
month = {sep},
370+
number = {3},
371+
numpages = {10},
372+
pages = {363--372},
373+
publisher = {ACM},
374+
issn = {0098-3500},
375+
title = {{A Simple Method for Generating Gamma Variables}},
376+
url = {http://doi.acm.org/10.1145/358407.358414},
377+
volume = {26},
378+
year = {2000},
379+
}
380+
381+
@article{kachitvichyanukul:1985,
382+
abstract = {The paper presents an exact, uniformly fast algorithm for generating random variates from the hypergeometric distribution. The overall algorithm framework is acceptance/ rejection and is implemented via composition. Three subdensities are used, one is uniform and the other two are exponential. The algorithm is compared with algorithms based on sampling without replacement, inversion, and aliasing. A comprehensive survey of existing algorithms is also given.},
383+
author = {Voratas. Kachitvichyanukul and Burce Schmeiser},
384+
doi = {10.1080/00949658508810839},
385+
journal = {Journal of Statistical Computation and Simulation},
386+
keywords = {random, rand, prng, rng, pseudorandom, number, generator, hypergeometric},
387+
number = {2},
388+
pages = {127-145},
389+
title = {{Computer generation of hypergeometric random variates}},
390+
url = {http://dx.doi.org/10.1080/00949658508810839},
391+
volume = {22},
392+
year = {1985},
393+
}
394+
395+
@article{nadler:2006,
396+
abstract = {\\(\em{Ziggurat}\\) and \\(\em{Monty Python}\\) are two fast and elegant methods proposed by Marsaglia and Tsang to transform uniform random variables to random variables with normal, exponential and other common probability distributions. While the proposed methods are theoretically correct, we show that there are various design flaws in the uniform pseudo random number generators (PRNG's) of their published implementations for both the normal and Gamma distributions. These flaws lead to non-uniformity of the resulting pseudo-random numbers and consequently to noticeable deviations of their outputs from the required distributions. In addition, we show that the underlying uniform PRNG of the published implementation of MATLAB's \texttt{randn}, which is also based on the Ziggurat method, is not uniformly distributed with correlations between consecutive pairs. Also, we show that the simple linear initialization of the registers in MATLAB's \texttt{randn} may lead to non-trivial correlations between output sequences initialized with different (related or even random unrelated) seeds. These, in turn, may lead to erroneous results for stochastic simulations.},
397+
author = {Boaz Nadler},
398+
doi = {},
399+
journal = {arXiv},
400+
keywords = {random, prng, rng, marsaglia, ziggurat, gaussian, monty python, uniform, rand},
401+
month = {mar},
402+
number = {},
403+
pages = {},
404+
title = {{Design Flaws in the Implementation of the Ziggurat and Monty Python methods (and some remarks on MATLAB randn)}},
405+
url = {https://arxiv.org/abs/math/0603058},
406+
volume = {abs/math/0603058},
407+
year = {2006},
408+
}
409+
410+
@article{mcfarland:2016,
411+
abstract = {The ziggurat algorithm is a very fast rejection sampling method for generating pseudorandom numbers (PRNs) from statistical distributions. In the algorithm, rectangular sampling domains are layered on top of each other (resembling a ziggurat) to encapsulate the desired probability density function. Random values within these layers are sampled and then returned if they lie beneath the graph of the probability density function. Here, we present an implementation where ziggurat layers reside completely beneath the probability density function, thereby eliminating the need for any rejection test within the ziggurat layers. In the new algorithm, small overhanging segments of probability density remain to the right of each ziggurat layer, which can be efficiently sampled with triangularly shaped sampling domains. Median runtimes of the new algorithm for exponential and normal variates is reduced to 58\% and 53\%, respectively (collective range: 41–93\%). An accessible C library, along with extensions into Python and MATLAB/Octave are provided.},
412+
author = {Christopher D. McFarland},
413+
doi = {10.1080/00949655.2015.1060234},
414+
journal = {Journal of Statistical Computation and Simulation},
415+
keywords = {random, rang, prng, rng, pseudorandom, ziggurat, gaussian, normal},
416+
number = {7},
417+
pages = {1281--1294},
418+
title = {{A modified ziggurat algorithm for generating exponentially and normally distributed pseudorandom numbers}},
419+
url = {http://dx.doi.org/10.1080/00949655.2015.1060234},
420+
volume = {86},
421+
year = {2016},
422+
}
423+
424+
@unpublished{doornik:2005,
425+
abstract = {The ziggurat is an efficient method to generate normal random samples. It is shown that the standard Ziggurat fails a commonly used test. An improved version that passes the test is introduced. Flexibility is enhanced by using a plug-in uniform random number generator. An efficient double-precision version of the ziggurat algorithm is developed that has a very high period.},
426+
author = {Jurgen A. Doornik},
427+
keywords = {random, rand, prng, rng, ziggurat, normal, gaussian, pseudorandom},
428+
note = {Provides an improved algorithm for generating normally distributed pseudorandom numbers via a ziggurat algorithm.},
429+
title = {{An Improved Ziggurat Method to Generate Normal Random Samples}},
430+
url = {https://www.doornik.com/research/ziggurat.pdf},
431+
year = {2005},
432+
}
433+
434+
@article{marsaglia:2000b,
435+
abstract = {We provide a new version of our ziggurat method for generating a random variable from a given decreasing density. It is faster and simpler than the original, and will produce, for example, normal or exponential variates at the rate of 15 million per second with a C version on a 400MHz PC. It uses two tables, integers \\(k_i\\), and reals \\(w_i\\). Some 99% of the time, the required \\(x\\) is produced by: Generate a random 32-bit integer \\(j\\) and let \\(i\\) be the index formed from the rightmost 8 bits of j. If \\(j < k\\), return \\(x = j \cdot w_i\\). We illustrate with C code that provides for inline generation of both normal and exponential variables, with a short procedure for setting up the necessary tables.},
436+
author = {George Marsaglia and Wai Wan Tsang},
437+
doi = {10.18637/jss.v005.i08},
438+
issn = {1548-7660},
439+
journal = {Journal of Statistical Software},
440+
keywords = {random, rand, prng, rng, pseudorandom, number, generator, ziggurat, normal, gaussian},
441+
number = {1},
442+
pages = {1--7},
443+
title = {{The Ziggurat Method for Generating Random Variables}},
444+
url = {https://www.jstatsoft.org/index.php/jss/article/view/v005i08},
445+
volume = {5},
446+
year = {2000},
447+
}
448+
449+
@article{marsaglia:1964,
450+
abstract = {},
451+
author = {George Marsaglia},
452+
doi = {10.1080/00401706.1964.10490150},
453+
journal = {Technometrics},
454+
keywords = {random, prng, rng, pseudorandom, number, generator, rand, normal, gaussian},
455+
number = {1},
456+
pages = {101-102},
457+
title = {{Generating a Variable from the Tail of the Normal Distribution}},
458+
url = {http://dx.doi.org/10.1080/00401706.1964.10490150},
459+
volume = {6},
460+
year = {1964},
461+
}

0 commit comments

Comments
 (0)