You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/references/bib.bib
+103Lines changed: 103 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -356,3 +356,106 @@ @article{thomas:2007
356
356
volume = {39},
357
357
year = {2007},
358
358
}
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},
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.},
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},
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.},
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.},
0 commit comments