vd      !"#$%&'()*+,-./0123456789:;< = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k lmnopqrstuvwxyz{|}~ Safe-Inferred rGiven an upward-closed predicate on an ordered Fractional type, find the smallest value satisfying the predicate. Given an upward-closed predicate on an ordered Fractional type, find the smallest value satisfying the predicate. Starts at the specified point with the specified stepsize, performs an exponential search out from there until it finds an interval bracketing the change-point of the predicate, and then performs a bisection search to isolate the change point. Note that infinitely-divisible domains such as  cannot be searched by this function because it does not terminate until it reaches a point where further subdivision of the interval has no effect.    None The  type doesn't expose its constructors, but I need a way to convert them to and from their raw representation in order to sample them. As long as  is a newtype wrapping ,   and : as defined here will work. Both are implemented using .    NoneNames of standard  typesNames of standard  types&replicateInstances standin types decls! will take the template-haskell s in decls& and substitute every instance of the  standin with each  in types, producing one copy of the s in decls for every  in types. For example, " has the following bit of TH code:  $( replicateInstances ''Int integralTypes [d| Y instance Distribution Uniform Int where rvar (Uniform a b) = integralUniform a b \ instance CDF Uniform Int where cdf (Uniform a b) = integralUniformCDF a b  |])bThis code takes those 2 instance declarations and creates identical ones for every type named in .None246FA class for "liftable" data structures. Conceptually an extension of _ to allow deep lifting, but lifting need not be done between monads only. Eg lifting between  Applicative s is allowed.For instances where m and n have 'return'/'pure') defined, these instances must satisfy lift (return x) == return x. This form of A has an extremely general type and is used primarily to support sampleG. Its excessive generality is the main reason it's not exported from  Data.Random.  is, however, an instance of >, which in most cases is the preferred way to do the lifting.~This instance is again incoherent with the others, but provides a more-specific instance to resolve the overlap between the  Lift m (t m) and Lift Identity m instances.BThis instance is incoherent with the others. However, by the law lift (return x) == return x', the results must always be the same.None246HMLike 3, but using an implicit lifting (provided by the  class)None36^Return the cumulative distribution function of this distribution. That is, a function taking x :: t to the probability that the next sample will return a value less than or equal to x, according to some order or partial order (not necessarily an obvious one).In the case where t is an instance of Ord, : should correspond to the CDF with respect to that order.In other cases, 1 is only required to satisfy the following law: fmap (cdf d) (rvar d)| must be uniformly distributed over (0,1). Inclusion of either endpoint is optional, though the preferred range is (0,1].)Note that this definition requires that  for a product type should _not_ be a joint CDF as commonly defined, as that definition violates both conditions. Instead, it should be a univariate CDF over the product type. That is, it should represent the CDF with respect to the lexicographic order of the product.The present specification is probably only really useful for testing conformance of a variable to its target distribution, and I am open to suggestions for more-useful specifications (especially with regard to the interaction with product types).A Z is a data representation of a random variable's probability structure. For example, in Data.Random.Distribution.Normal, the Normal distribution is defined as: .data Normal a = StdNormal | Normal a a Where the two parameters of the Normalr data constructor are the mean and standard deviation of the random variable, respectively. To make use of the Normal type, one can convert it to an  * and manipulate it or sample it directly: :x <- sample (rvar (Normal 10 2)) x <- sample (Normal 10 2)A ' is typically more transparent than an { but less composable (precisely because of that transparency). There are several practical uses for types implementing : Typically, a  will expose several parameters of a standard mathematical model of a probability distribution, such as mean and std deviation for the normal distribution. Thus, they can be manipulated analytically using mathematical insights about the distributions they represent. For example, a collection of bernoulli variables could be simplified into a (hopefully) smaller collection of binomial variables.Because they are generally just containers for parameters, they can be easily serialized to persistent storage or read from user-supplied configurations (eg, initialization data for a simulation).&If a type additionally implements the  subclass, which extends C with a cumulative density function, an arbitrary random variable x4 can be tested against the distribution by testing fmap (cdf dist) x for uniformity.On the other hand, most 7s will not be closed under all the same operations as  (which, being a monad, has a fully turing-complete internal computational model). The sum of two uniformly-distributed variables, for example, is not uniformly distributed. To support general composition, the  class defines a function  6 to construct the more-abstract and more-composable ' representation of a random variable. 0Return a random variable with this distribution.!QReturn a random variable with the given distribution, pre-lifted to an arbitrary . Any arbitrary 8 can also be converted to an 'RVarT m' for an arbitrary m, using either  or sample. ! ! ! !None 23468<"=A name for the "standard" uniform distribution over the type t, if one exists. See also 8.For  and  types that are also M, this is the uniform distribution over the full range of the type. For un- ! types this is not defined. For g types this is a random variable in the range [0,1) (that is, 0 to 1 including 0 but not including 1).$5A definition of a uniform distribution over the type t . See also 6.%FA uniform distribution defined by a lower and upper range bound. For  and % types, the range is inclusive. For = types the range includes the lower bound but not the upper.&Compute a random 1 value between the 2 values provided (inclusive).'Compute a random value for a  type, between  and  (inclusive for  or  types, in [, ) for Fractional types.))Compute a random value for a   type, between  and  (inclusive)*Compute a uniform random  value in the range [0,1)+Compute a uniform random  value in the range [0,1),:Compute a uniform random value in the range [0,1) for any  type -Compute a uniform random 7 value in the range [0,1), with any desired precision..The CDF of the random variable ,.The PDF of the random variable ,.'(internal) basic linear interpolation; lerp x y& is a linear function whose value is x at 0 and y at 1/floatUniform a b computes a uniform random  value in the range [a,b)0doubleUniform a b computes a uniform random  value in the range [a,b)1realFloatUniform a b= computes a uniform random value in the range [a,b) for any  type2fixedUniform a b computes a uniform random 8 value in the range [a,b), with any desired precision.3realUniformCDF a b# is the CDF of the random variable realFloatUniform a b.4realFloatUniform a b= computes a uniform random value in the range [a,b) for any  type8Get a "standard" uniformly distributed variable. For integral types, this means uniformly distributed over the full range of the type (there is no support for R). For fractional types, this means uniformly distributed on the interval [0,1).9Get a "standard" uniformly distributed process. For integral types, this means uniformly distributed over the full range of the type (there is no support for R). For fractional types, this means uniformly distributed on the interval [0,1). Like 8, but returns only positive or zero values. Not exported because it is not truly uniform: nonzero values are twice as likely as zero on signed types.:Like 8" but only returns positive values.;Like 8" but only returns positive values.P"#$%&    '()*+,-./0123456789 :; !"#$%&'()*+,-./0123456789:;<"#$%&'()*+,-./0123456789:;$%67"#89:;&1/024'),-*+(.35N"#$%&    '()*+,-./0123456789 :; !"#$%&'()*+,-./0123456789:;< None<A random variable returning an arbitrary element of the given list. Every element has equal probability of being chosen. Because it is a pure 9 it has no memory - that is, it "draws with replacement.">A random variable that returns the given list in an arbitrary shuffled order. Every ordering of the list has equal probability.@A random variable that shuffles a list of a known length (or a list prefix of the specified length). Useful for shuffling large lists when the length is known in advance. Avoids needing to traverse the list to discover its length. Each ordering has equal probability.BPA random variable that selects N arbitrary elements of a list of known length M.<=>?@ABC<=>?@ABC<=>?@ABC<=>?@ABC NoneD"Take a random element of a vector.DDDD None2346G>Generate a Bernoulli variate with the given probability. For Bool results,  bernoulli pw will return True (p*100)% of the time and False otherwise. For numerical types, True is replaced by 1 and False by 0.H>Generate a Bernoulli process with the given probability. For Bool results,  bernoulli pw will return True (p*100)% of the time and False otherwise. For numerical types, True is replaced by 1 and False by 0.I!A random variable whose value is =% the given fraction of the time and > the rest.KgeneralBernoulli t f p, generates a random variable whose value is t with probability p and f with probability 1-p.EFGHIJKLMNOPQRSTEFGHIJKL(GHIJKLEFNMOOOOOOOOOOOOOOOOOOOOOOTTTTSRQPEFGHIJKLMNOPQRST None2346 UCategorical distribution; a list of events with corresponding probabilities. The sum of the probabilities must be 1, and no event should have a zero or negative probability (at least, at time of sampling; very clever users can do what they want with the numbers before sampling, just make sure that if you're one of those clever ones, you at least eliminate negative weights before sampling).V Construct a Ud random variable from a list of probabilities and categories, where the probabilities all sum to 1.W Construct a Ud random process from a list of probabilities and categories, where the probabilities all sum to 1.X Construct a Ud random variable from a list of probabilities and categories, where the probabilities all sum to 1.Y Construct a Ud random process from a list of probabilities and categories, where the probabilities all sum to 1.Z Construct a U1 distribution from a list of weighted categories.^ Construct a Ub distribution from a list of weighted categories, where the weights do not necessarily sum to 1._ Construct a U distribution from a list of observed outcomes. Equivalent events will be grouped and counted, and the probabilities of each event in the returned distribution will be proportional to the number of occurrences of that event.`Like ?:, but for the probabilities of a categorical distribution.aAdjust all the weights of a categorical distribution so that they sum to unity and remove all events whose probability is zero.bSimplify a categorical distribution by combining equivalent events (the new event will have a probability equal to the sum of all the originals).cCSimplify a categorical distribution by combining equivalent events (the new event will have a weight equal to the sum of all the originals). The comparator function is used to identify events to combine. Once chosen, the events and their weights are combined by the provided probability and event aggregation function.U@VWXYZ[\]^_`abcABCDEFGHUVWXYZ[\]^_`abcUVWXYZ[\]^_`abcU@VWXYZ[\]^_`abcABCDEFGH None2346defghijkdefghidefghikjdefghijkNone2346lmnopqrslmnopqlmnopqsrlmnopqrsNone 2346HMtA data structure containing all the data that is needed to implement Marsaglia & Tang's "ziggurat" algorithm for sampling certain kinds of random distributions.The documentation here is probably not sufficient to tell a user exactly how to build one of these from scratch, but it is not really intended to be. There are several helper functions that will build t4s. The pathologically curious may wish to read the ~R source. That is the ultimate specification of the semantics of all these fields.v@The X locations of each bin in the distribution. Bin 0 is the infinite one.AIn the case of bin 0, the value given is sort of magical - x[0] is defined to be V/f(R). It's not actually the location of any bin, but a value computed to make the algorithm more concise and slightly faster by not needing to specially-handle bin 0 quite as often. If you really need to know why it works, see the ~< source or "the literature" - it's a fairly standard setup.w9The ratio of each bin's Y value to the next bin's Y valuex!The Y value (zFunc x) of each biny/An RVar providing a random tuple consisting of:.a bin index, uniform over [0,c) :: Int (where c) is the number of bins in the tables)ca uniformly distributed fractional value, from -1 to 1 if not mirrored, from 0 to 1 otherwise.This is provided as a single  because it can be implemented more efficiently than naively sampling 2 separate values - a single random word (64 bits) can be efficiently converted to a double (using 52 bits) and a bin number (using up to 12 bits), for example.zThe distribution for the final "virtual" bin (the ziggurat algorithm does not handle distributions that wander off to infinity, so another distribution is needed to handle the last "bin" that stretches to infinity){AA copy of the uniform RVar generator for the base type, so that Distribution Uniform tS is not needed when sampling from a Ziggurat (makes it a bit more self-contained).|8The (one-sided antitone) PDF, not necessarily normalized}A flag indicating whether the distribution should be mirrored about the origin (the ziggurat algorithm in its native form only samples from one-sided distributions. By mirroring, we can extend it to symmetric distributions such as the normal distribution)~*Sample from the distribution encoded in a t data structure.Build the tables to implement the "ziggurat algorithm" devised by Marsaglia & Tang, attempting to automatically compute the R and V values. Arguments:2flag indicating whether to mirror the distribution8the (one-sided antitone) PDF, not necessarily normalizedthe inverse of the PDFthe number of binsR, the x value of the first binV, the volume of each binan RVar providing the y random tuple7an RVar sampling from the tail (the region where x > R)Build the tables to implement the "ziggurat algorithm" devised by Marsaglia & Tang, attempting to automatically compute the R and V values.Arguments are the same as for `, with an additional argument for the tail distribution as a function of the selected R value.Build a lazy recursive ziggurat. Uses a lazily-constructed ziggurat as its tail distribution (with another as its tail, ad nauseam). Arguments:2flag indicating whether to mirror the distribution8the (one-sided antitone) PDF, not necessarily normalizedthe inverse of the PDF*the integral of the PDF (definite, from 0)8the estimated volume under the PDF (from 0 to +infinity)Ythe chunk size (number of bins in each layer). 64 seems to perform well in practice.an RVar providing the y random tupleuI suspect this isn't completely right, but it works well so far. Search the distribution for an appropriate R and V. Arguments:Number of binsDtarget function (one-sided antitone PDF, not necessarily normalized)function inverse(function definite integral (from 0 to _)Eestimate of total volume under function (integral from 0 to infinity) Result: (R,V)tuvwxyz{|}~IJKLMNtuvwxyz{|}~tuvwxyz{|}~ t uvwxyz{|}~IJKLMNNone  2346HM7A specification of a normal distribution over the type a. Normal m s$ is a normal distribution with mean m and stddev sd.5The "standard" normal distribution - mean 0, stddev 1SA random variable that produces a pair of independent normally-distributed values.?A random variable that produces a pair of independent normally-distributed values, computed using the Box-Muller method. This algorithm is slightly slower than Knuth's method but using a constant amount of entropy (Knuth's method is a rejection method). It is also slightly more general (Knuth's method require an O instance).A random variable that produces a pair of independent normally-distributed values, computed using Knuth's polar method. Slightly faster than ? when it accepts on the first try, but does not always do so.RDraw from the tail of a normal distribution (the region beyond the provided value)P Construct a t, for sampling a normal distribution, given  logBase 2 c and the y implementation.QFZiggurat target function (upper half of a non-normalized gaussian PDF)R inverse of QS integral of QT volume of QKA random variable sampling from the standard normal distribution over any F type (subject to the rest of the constraints - it builds and uses a t internally, which requires the U class). Because it computes a t>, it is very expensive to use for just one evaluation, or even for multiple evaluations if not used and reused monomorphically (to enable the ziggurat table to be let-floated out). If you don't know whether your use case fits this description then you're probably better off using a different algorithm, such as  or n. And of course if you don't need the full generality of this definition then you're much better off using  or .AAs far as I know, this should be safe to use in any monomorphic Distribution Normal instance declaration.KA random variable sampling from the standard normal distribution over the  type.KA random variable sampling from the standard normal distribution over the  type.( is a normal variable with distribution .' is a normal process with distribution . normal m s( is a random variable with distribution  m s. normalT m s' is a random process with distribution  m s."PQRSTVWXYZ[\]^_`abcd PQRSTVWXYZ[\]^_`abcdNone2346derived from Marsaglia & Tang, "A Simple Method for generating gamma variables", ACM Transactions on Mathematical Software, Vol 26, No 3 (2000), p363-372. efgh efghNone2346  None2346 3 None!"2346None2346None!"2346None2346 " None2346WThe rayleigh distribution with a specified mode ("sigma") parameter. Its mean will be sigma*sqrt(pi/2) and its variance will be sigma^2*(4-pi)/22(therefore if you want one with a particular mean m, sigma should be  m*sqrt(2/pi))None2346None2346A description of a triangular distribution - a distribution whose PDF is a triangle ramping up from a lower bound to a specified midpoint and back down to the upper bound. This is a very simple distribution that does not generally occur naturally but is used sometimes as an estimate of a true distribution when only the range of the values and an approximate mode of the true distribution are known.^The lower bound of the triangle in the PDF (the smallest number the distribution can generate)@The midpoint of the triangle (also the mode of the distribution)VThe upper bound of the triangle (and the largest number the distribution can generate)(Compute a triangular distribution for a i type.triangularCDF a b c is the CDF of realFloatTriangular a b c.  None246None2346A typeclass allowing s and 0s to be sampled. Both may also be sampled via  or , but I find it psychologically pleasing to be able to sample both using this function, as they are two separate abstractions for one base concept: a random variable.ZDirectly sample from a distribution or random variable, using the given source of entropy.iSample a random variable using the default source of entropy for the monad in which the sampling occurs.NSample a random variable in a "functional" style. Typical instantiations of s are System.Random.StdGen or $System.Random.Mersenne.Pure64.PureMT.SSample a random variable in a "semi-functional" style. Typical instantiations of s are System.Random.StdGen or $System.Random.Mersenne.Pure64.PureMT.None- !"#$%6789<>@B- !$%67"#89<>@BNone2346j ! !"#"$%&'%&(%&)%&*+,-./0123456789:;<=>?@ABCDEEFGHIJKLMNOPQRSTUVWXYZ[ \ ] ^ _ ` a b c \ d d e f g h i j k l m n o p q r s t u v w x y z { | } ~          !" !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXY !Z ![\] s ^ _ ` a b c d efghijk lmnopqrstuvwxyz{|}~random-fu-0.2.6.1 Data.RandomData.Random.RVarData.Random.Internal.FindData.Random.Internal.FixedData.Random.Internal.THData.Random.LiftData.Random.Distribution Data.Random.Distribution.UniformData.Random.ListData.Random.Vector"Data.Random.Distribution.Bernoulli$Data.Random.Distribution.Categorical$Data.Random.Distribution.Exponential-Data.Random.Distribution.StretchedExponential!Data.Random.Distribution.ZigguratData.Random.Distribution.NormalData.Random.Distribution.GammaData.Random.Distribution.Beta!Data.Random.Distribution.Binomial$Data.Random.Distribution.Multinomial"Data.Random.Distribution.ChiSquare"Data.Random.Distribution.Dirichlet Data.Random.Distribution.Poisson!Data.Random.Distribution.RayleighData.Random.Distribution.T#Data.Random.Distribution.Triangular Data.Random.Distribution.WeibullData.Random.SampleData.Random.Distribution.ParetoUniformrandom-source-0.3.0.6Data.Random.Source.Std StdRandomData.Random.Internal.Source MonadRandom RandomSource rvar-0.2.0.2 Data.RVar runRVarTWithrunRVarRVarRVarTfindMaxfindMin findMinFrom resolutionOf resolutionOf2mkFixed unMkFixed integralTypesrealFloatTypesreplicateInstancesLiftlift$fLiftIdentityt$fLiftRVarTRVarT$fLiftIdentitym$fLiftmm$fLiftmtrunRVarTCDFcdfPDFpdflogPdf DistributionrvarrvarT StdUniformintegralUniformboundedStdUniformboundedStdUniformCDFboundedEnumStdUniformfloatStdUniformdoubleStdUniformrealFloatStdUniformfixedStdUniformrealStdUniformCDF floatUniform doubleUniformrealFloatUniform fixedUniformrealUniformCDF enumUniformenumUniformCDFuniformuniformT stdUniform stdUniformT stdUniformPosstdUniformPosT randomElementrandomElementTshuffleshuffleTshuffleN shuffleNT shuffleNofM shuffleNofMT Bernoulli bernoulli bernoulliT boolBernoulliboolBernoulliCDFgeneralBernoulligeneralBernoulliCDF$fCDFBernoulliBool$fDistributionBernoulliBool$fDistributionBernoulliInteger$fCDFBernoulliComplex$fDistributionBernoulliComplex$fCDFBernoulliRatio$fDistributionBernoulliRatio$fDistributionBernoulliFloat Categorical categorical categoricalTweightedCategoricalweightedCategoricalTfromListtoList totalWeight numEventsfromWeightedListfromObservationsmapCategoricalPsnormalizeCategoricalPs collectEventscollectEventsBy ExponentialExpfloatingExponentialfloatingExponentialCDF exponential exponentialT$fCDFExponentiala$fDistributionExponentialaStretchedExponential StretchedExpfloatingStretchedExponentialfloatingStretchedExponentialCDFstretchedExponentialstretchedExponentialT$fCDFStretchedExponentiala#$fDistributionStretchedExponentialaZiggurat zTable_xszTable_y_ratios zTable_yszGetIU zTailDistzUniformzFunczMirror runZiggurat mkZiggurat_ mkZiggurat mkZigguratRecfindBin0Normal StdNormal normalPairboxMullerNormalPairknuthPolarNormalPair normalTailrealFloatStdNormaldoubleStdNormalfloatStdNormal stdNormal stdNormalTnormalnormalTErlangGammamtGammagammagammaTerlangerlangTBetafractionalBetabetabetaT logBetaPdf$fPDFBetaFloat$fPDFBetaDouble$fDistributionBetaFloatBinomialintegralBinomialintegralBinomialCDFintegralBinomialPDFintegralBinomialLogPdffloatingBinomialfloatingBinomialCDFfloatingBinomialPDFfloatingBinomialLogPDFbinomial binomialT$fDistributionBinomialInteger$fDistributionBinomialFloat Multinomial multinomial multinomialT$fDistributionMultinomial[] ChiSquare chiSquare chiSquareT$fCDFChiSquaret$fDistributionChiSquaret DirichletfractionalDirichlet dirichlet dirichletT$fDistributionDirichlet[]PoissonintegralPoissonintegralPoissonCDFfractionalPoissonfractionalPoissonCDFpoissonpoissonT$fDistributionPoissonInteger$fDistributionPoissonFloatRayleighfloatingRayleighrayleigh rayleighT rayleighCDF$fCDFRayleigha$fDistributionRayleighaTttT$fCDFTa$fDistributionTa TriangulartriLowertriMidtriUpperfloatingTriangular triangularCDF$fCDFTriangulara$fDistributionTriangularaWeibull weibullLambdaweibullK $fCDFWeibulla$fDistributionWeibulla Sampleable sampleFromsample sampleState sampleStateT$fSampleableRVarTnt$fSampleabledmtParetoparetoparetoT $fCDFParetoa$fDistributionParetoabaseGHC.RealRational Data.FixedFixed integer-gmpGHC.Integer.TypeInteger Unsafe.Coerce unsafeCoerceIntegral GHC.Float RealFloattemplate-haskellLanguage.Haskell.TH.SyntaxDecName replaceNametransformers-0.4.1.0Control.Monad.Trans.Class MonadTransGHC.EnumEnumBounded FractionalminBoundmaxBoundghc-prim GHC.TypesFloatDoublerealStdUniformPDFlerpstdUniformNonnegintegralUniform'integralUniformCDF bytesNeeded powersOf256boundedEnumStdUniformCDF$fCDFUniform()$fDistributionUniform()$fCDFStdUniformFixed$fDistributionStdUniformFixed$fCDFUniformFixed$fDistributionUniformFixed$fPDFStdUniformDouble$fPDFStdUniformFloat$fCDFStdUniformDouble$fCDFStdUniformFloat$fDistributionStdUniformDouble$fDistributionStdUniformFloat$fCDFUniformDouble$fCDFUniformFloat$fDistributionUniformDouble$fDistributionUniformFloat$fCDFStdUniformInt$fCDFStdUniformInt64$fCDFStdUniformInt32$fCDFStdUniformInt16$fCDFStdUniformInt8$fCDFStdUniformWord$fCDFStdUniformWord64$fCDFStdUniformWord32$fCDFStdUniformWord16$fCDFStdUniformWord8$fDistributionStdUniformWord$fDistributionStdUniformInt$fDistributionStdUniformInt64$fDistributionStdUniformInt32$fDistributionStdUniformInt16$fDistributionStdUniformInt8$fDistributionStdUniformWord64$fDistributionStdUniformWord32$fDistributionStdUniformWord16$fDistributionStdUniformWord8$fDistributionUniformInteger$fCDFStdUniformOrdering $fDistributionStdUniformOrdering$fCDFStdUniformChar$fDistributionStdUniformChar$fCDFStdUniformBool$fDistributionStdUniformBool$fCDFStdUniform()$fDistributionStdUniform()$fDistributionUniformCharTrueFalseGHC.Basefmap$fApplicativeCategorical$fMonadCategorical$fTraversableCategorical$fFoldableCategorical$fFunctorCategorical$fDistributionCategoricala$fReadCategorical$fShowCategoricalmkTail zigguratTablezigguratExcess zigguratXsprecomputeRatios$fDistributionZigguratt GHC.ClassesOrdnormalZnormalF normalFInv normalFInt normalFVol erf-2.0.0.0Data.Number.ErfErfdoubleStdNormalCdoubleStdNormalRdoubleStdNormalVdoubleStdNormalZfloatStdNormalCfloatStdNormalRfloatStdNormalVfloatStdNormalZ normalCdf normalPdf normalLogPdf $fPDFNormala $fCDFNormala$fDistributionNormalFloat$fDistributionNormalDouble $fCDFErlangb$fDistributionErlangb $fCDFGammaa$fDistributionGammaaFloating