Movatterモバイル変換


[0]ホーム

URL:


D Logo
Menu
Search

Library Reference

version 2.112.0

overview

Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.Requires a signed-in GitHub account. This works well for small changes.If you'd like to make larger changes you may want to consider usinga local clone.

std.random

Facilities for random number generation.
CategoryFunctions
Uniform samplinguniformuniform01uniformDistribution
Element samplingchoicedice
Range samplingrandomCoverrandomSample
Default Random EnginesrndGenRandomunpredictableSeed
Linear Congruential EnginesMinstdRandMinstdRand0LinearCongruentialEngine
Mersenne Twister EnginesMt19937Mt19937_64MersenneTwisterEngine
Xorshift EnginesXorshiftXorshiftEngineXorshift32Xorshift64Xorshift96Xorshift128Xorshift160Xorshift192
ShufflepartialShufflerandomShuffle
TraitsisSeedableisUniformRNG
Disclaimer: The random number generators and API provided in thismodule are not designed to be cryptographically secure, and are thereforeunsuitable for cryptographic or security-related purposes such as generatingauthentication tokens or network sequence numbers. For such needs, please use areputable cryptographic library instead.
The new-style generator objects hold their own state so they areimmune of threading issues. The generators feature a number ofwell-known and well-documented methods of generating randomnumbers. An overall fast and reliable means to generate random numbersis theMt19937 generator, which derives its name from"Mersenne Twisterwith a period of 2 to the power of19937". In memory-constrained situations,linear congruential generators such asMinstdRand0 andMinstdRand might beuseful. The standard library provides an aliasRandom forwhichever generator it considers the most fit for the targetenvironment.
In addition to random number generators, this module featuresdistributions, which skew a generator's output statisticaldistribution in various ways. So far the uniform distribution forintegers and real numbers have been implemented.

Sourcestd/random.d

License:
Boost License 1.0.
Authors:
Andrei Alexandrescu Masahiro Nakagawa (Xorshift random generator)Joseph Rushton Wakeling (Algorithm D for random sampling) Ilya Yaroshenko (Mersenne Twister implementation, adapted frommir-random)

CreditsThe entire random number library architecture is derived from the excellentC++0X random number facility proposed by Jens Maurer and contributed to by researchers at the Fermi laboratory (excluding Xorshift).

Examples:
import std.algorithm.comparison : among, equal;import std.range : iota;// seed a random generator with a constantauto rnd = Random(42);// Generate a uniformly-distributed integer in the range [0, 14]// If no random generator is passed, the global `rndGen` would be usedauto i = uniform(0, 15, rnd);assert(i >= 0 && i < 15);// Generate a uniformly-distributed real in the range [0, 100)auto r = uniform(0.0L, 100.0L, rnd);assert(r >= 0 && r < 100);// Sample from a custom typeenum Fruit { apple, mango, pear }auto f = rnd.uniform!Fruit;with(Fruit)assert(f.among(apple, mango, pear));// Generate a 32-bit random numberauto u = uniform!uint(rnd);staticassert(is(typeof(u) ==uint));// Generate a random number in the range in the range [0, 1)auto u2 = uniform01(rnd);assert(u2 >= 0 && u2 < 1);// Select an element randomlyauto el = 10.iota.choice(rnd);assert(0 <= el && el < 10);// Throw a dice with custom proportions// 0: 20%, 1: 10%, 2: 60%auto val = rnd.dice(0.2, 0.1, 0.6);assert(0 <= val && val <= 2);auto rnd2 = MinstdRand0(42);// Select a random subsample from a rangeassert(10.iota.randomSample(3, rnd2).equal([7, 8, 9]));// Cover all elements in an array in random orderversion (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147assert(10.iota.randomCover(rnd2).equal([7, 4, 2, 0, 1, 6, 8, 3, 9, 5]));elseassert(10.iota.randomCover(rnd2).equal([4, 8, 7, 3, 5, 9, 2, 6, 0, 1]));// Shuffle an arrayversion (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147assert([0, 1, 2, 4, 5].randomShuffle(rnd2).equal([2, 0, 4, 5, 1]));elseassert([0, 1, 2, 4, 5].randomShuffle(rnd2).equal([4, 2, 5, 0, 1]));
enum autoisUniformRNG(Rng, ElementType);

enum autoisUniformRNG(Rng);
Test if Rng is a random-number generator. The overload taking a ElementType also makes sure that the Rng generates values of that type.
A random-number generator has at least the following features:
  • it's an InputRange
  • it has a 'bool isUniformRandom' field readable in CTFE
Examples:
struct NoRng{    @propertyuint front() {return 0;}    @propertybool empty() {returnfalse;}void popFront() {}}staticassert(!isUniformRNG!(NoRng));struct validRng{    @propertyuint front() {return 0;}    @propertybool empty() {returnfalse;}void popFront() {}enum isUniformRandom =true;}staticassert(isUniformRNG!(validRng,uint));staticassert(isUniformRNG!(validRng));
enum autoisSeedable(Rng, SeedType);

enum autoisSeedable(Rng);
Test if Rng is seedable. The overload taking a SeedType also makes sure that the Rng can be seeded with SeedType.
A seedable random-number generator has the following additional features:
  • it has a 'seed(ElementType)' function
Examples:
struct validRng{    @propertyuint front() {return 0;}    @propertybool empty() {returnfalse;}void popFront() {}enum isUniformRandom =true;}staticassert(!isSeedable!(validRng,uint));staticassert(!isSeedable!(validRng));struct seedRng{    @propertyuint front() {return 0;}    @propertybool empty() {returnfalse;}void popFront() {}void seed(uint val){}enum isUniformRandom =true;}staticassert(isSeedable!(seedRng,uint));staticassert(!isSeedable!(seedRng,ulong));staticassert(isSeedable!(seedRng));
structLinearCongruentialEngine(UIntType, UIntType a, UIntType c, UIntType m) if (isUnsigned!UIntType);
Linear Congruential generator. When m = 0, no modulus is used.
Examples:
Declare your own linear congruential engine
alias CPP11LCG =LinearCongruentialEngine!(uint, 48271, 0, 2_147_483_647);// seed with a constantauto rnd = CPP11LCG(42);auto n = rnd.front;// same for each runwriteln(n);// 2027382
Examples:
Declare your own linear congruential engine
// glibc's LCGalias GLibcLCG =LinearCongruentialEngine!(uint, 1103515245, 12345, 2_147_483_648);// Seed with an unpredictable valueauto rnd = GLibcLCG(unpredictableSeed);auto n = rnd.front;// different across runs
Examples:
Declare your own linear congruential engine
// Visual C++'s LCGalias MSVCLCG =LinearCongruentialEngine!(uint, 214013, 2531011, 0);// seed with a constantauto rnd = MSVCLCG(1);auto n = rnd.front;// same for each runwriteln(n);// 2745024
enum boolisUniformRandom;
Mark this as a Rng
enum boolhasFixedRange;
Does this generator have a fixed range? (true).
enum UIntTypemin;
Lowest generated value (1 ifc == 0,0 otherwise).
enum UIntTypemax;
Highest generated value (modulus - 1).
enum UIntTypemultiplier;

enum UIntTypeincrement;

enum UIntTypemodulus;
The parameters of this distribution. The random number isx= (x * multipler + increment) % modulus.
pure nothrow @nogc @safe this(UIntTypex0);
Constructs aLinearCongruentialEngine generator seeded withx0.
pure nothrow @nogc @safe voidseed(UIntTypex0 = 1);
(Re)seeds the generator.
pure nothrow @nogc @safe voidpopFront();
Advances the random sequence.
pure nothrow @nogc @property @safe UIntTypefront() const;
Returns the current number in the random sequence.
pure nothrow @nogc @property @safe typeof(this)save() const;
enum boolempty;
Alwaysfalse (random generators are infinite ranges).
aliasMinstdRand0 = LinearCongruentialEngine!(uint, 16807u, 0u, 2147483647u).LinearCongruentialEngine;

aliasMinstdRand = LinearCongruentialEngine!(uint, 48271u, 0u, 2147483647u).LinearCongruentialEngine;
DefineLinearCongruentialEngine generators with well-chosenparameters.MinstdRand0 implements Park and Miller's "minimalstandard"generator that uses 16807 for the multiplier.MinstdRandimplements a variant that has slightly better spectral behavior byusing the multiplier 48271. Both generators are rather simplistic.
Examples:
// seed with a constantauto rnd0 =MinstdRand0(1);auto n = rnd0.front;// same for each runwriteln(n);// 16807// Seed with an unpredictable valuernd0.seed(unpredictableSeed);n = rnd0.front;// different across runs
structMersenneTwisterEngine(UIntType, size_t w, size_t n, size_t m, size_t r, UIntType a, size_t u, UIntType d, size_t s, UIntType b, size_t t, UIntType c, size_t l, UIntType f) if (isUnsigned!UIntType);
TheMersenne Twister generator.
Examples:
// seed with a constantMt19937 gen;auto n = gen.front;// same for each runwriteln(n);// 3499211612// Seed with an unpredictable valuegen.seed(unpredictableSeed);n = gen.front;// different across runs
enum boolisUniformRandom;
Mark this as a Rng
enum size_twordSize;

enum size_tstateSize;

enum size_tshiftSize;

enum size_tmaskBits;

enum UIntTypexorMask;

enum size_ttemperingU;

enum UIntTypetemperingD;

enum size_ttemperingS;

enum UIntTypetemperingB;

enum size_ttemperingT;

enum UIntTypetemperingC;

enum size_ttemperingL;

enum UIntTypeinitializationMultiplier;
Parameters for the generator.
enum UIntTypemin;
Smallest generated value (0).
enum UIntTypemax;
Largest generated value.
enum UIntTypedefaultSeed;
The default seed value.
pure nothrow @nogc @safe this(UIntTypevalue);
Constructs a MersenneTwisterEngine object.
pure nothrow @nogc @safe voidseed()(UIntTypevalue = defaultSeed);
Seeds a MersenneTwisterEngine object.

NoteThis seed function gives 2^w starting points (the lowest w bits of the value provided will be used). To allow the RNG to be started in any one of its internal states use the seed overload taking an InputRange.

voidseed(T)(Trange)
if (isInputRange!T && is(immutable(ElementType!T) == immutable(UIntType)));
Seeds a MersenneTwisterEngine object using an InputRange.
Throws:
Exception if the InputRange didn't provide enough elements to seed the generator. The number of elements required is the 'n' template parameter of the MersenneTwisterEngine struct.
pure nothrow @nogc @safe voidpopFront();
Advances the generator.
pure nothrow @nogc @property @safe UIntTypefront() const;
Returns the current random value.
pure nothrow @nogc @property @safe typeof(this)save() const;
enum boolempty;
Alwaysfalse.
aliasMt19937 = MersenneTwisterEngine!(uint, 32LU, 624LU, 397LU, 31LU, 2567483615u, 11LU, 4294967295u, 7LU, 2636928640u, 15LU, 4022730752u, 18LU, 1812433253u).MersenneTwisterEngine;
AMersenneTwisterEngine instantiated with the parameters of theoriginal engineMT19937, generating uniformly-distributed 32-bit numbers with aperiod of 2 to the power of 19937. Recommended for random numbergeneration unless memory is severely restricted, in which case aLinearCongruentialEngine would be the generator of choice.
Examples:
// seed with a constantMt19937 gen;auto n = gen.front;// same for each runwriteln(n);// 3499211612// Seed with an unpredictable valuegen.seed(unpredictableSeed);n = gen.front;// different across runs
aliasMt19937_64 = MersenneTwisterEngine!(ulong, 64LU, 312LU, 156LU, 31LU, 13043109905998158313LU, 29LU, 6148914691236517205LU, 17LU, 8202884508482404352LU, 37LU, 18444473444759240704LU, 43LU, 6364136223846793005LU).MersenneTwisterEngine;
AMersenneTwisterEngine instantiated with the parameters of theoriginal engineMT19937-64, generating uniformly-distributed 64-bit numbers with aperiod of 2 to the power of 19937.
Examples:
// Seed with a constantauto gen =Mt19937_64(12345);auto n = gen.front;// same for each runwriteln(n);// 6597103971274460346// Seed with an unpredictable valuegen.seed(unpredictableSeed!ulong);n = gen.front;// different across runs
structXorshiftEngine(UIntType, uint nbits, int sa, int sb, int sc) if (isUnsigned!UIntType && !(sa > 0 && (sb > 0) && (sc > 0)));

templateXorshiftEngine(UIntType, int bits, int a, int b, int c) if (isUnsigned!UIntType && (a > 0) && (b > 0) && (c > 0))
Xorshift generator.Implemented according toXorshift RNGs(Marsaglia, 2003) when the size is small. For larger sizes the generatoruses Sebastino Vigna's optimization of using an index to avoid needingto rotate the internal array.
Period is2 ^^ nbits - 1 except for a legacy 192-bit uint version (seenote below).
Parameters:
UIntTypeWord size of this xorshift generator and the return type ofopCall.
nbitsThe number of bits of state of this generator. This must be a positive multiple of the size in bits of UIntType. If nbits is large this struct may occupy slightly more memory than this so it can use a circular counter instead of shifting the entire array.
saThe direction and magnitude of the 1st shift. Positive means left, negative means right.
sbThe direction and magnitude of the 2nd shift. Positive means left, negative means right.
scThe direction and magnitude of the 3rd shift. Positive means left, negative means right.

NoteFor historical compatibility whennbits == 192 andUIntType isuinta legacy hybrid PRNG is used consisting of a 160-bit xorshift combinedwith a 32-bit counter. This combined generator has period equal to theleast common multiple of2^^160 - 1 and2^^32.

Previous versions ofXorshiftEngine did not provide any mechanism to specifythe directions of the shifts, taking each shift as an unsigned magnitude.For backwards compatibility, because three shifts in the same directioncannot result in a full-period XorshiftEngine, when all three ofsa,sb,sc, are positiveXorshiftEngine` treats them as unsigned magnitudes anduses shift directions to match the old behavior ofXorshiftEngine.
Not every set of shifts results in a full-period xorshift generator.The template does not currently at compile-time perform a full checkfor maximum period but in a future version might reject parametersresulting in shorter periods.

Examples:
alias Xorshift96  =XorshiftEngine!(uint, 96,  10, 5,  26);auto rnd = Xorshift96(42);auto num = rnd.front;// same for each runwriteln(num);// 2704588748
enum boolisUniformRandom;
Mark this as a Rng
enum autoempty;
Alwaysfalse (random generators are infinite ranges).
enum UIntTypemin;
Smallest generated value.
enum UIntTypemax;
Largest generated value.
pure nothrow @nogc @safe this()(UIntTypex0);
Constructs aXorshiftEngine generator seeded withx0.
Parameters:
UIntTypex0value used to deterministically initialize internal state
pure nothrow @nogc @safe voidseed()(UIntTypex0);
(Re)seeds the generator.
Parameters:
UIntTypex0value used to deterministically initialize internal state
pure nothrow @nogc @property @safe UIntTypefront() const;
Returns the current number in the random sequence.
pure nothrow @nogc @safe voidpopFront();
Advances the random sequence.
pure nothrow @nogc @property @safe typeof(this)save() const;
Captures a range state.
aliasXorshift32 = XorshiftEngine!(uint, 32u, 13, -17, 15).XorshiftEngine;

aliasXorshift64 = XorshiftEngine!(uint, 64u, 10, -13, -10).XorshiftEngine;

aliasXorshift96 = XorshiftEngine!(uint, 96u, 10, -5, -26).XorshiftEngine;

aliasXorshift128 = XorshiftEngine!(uint, 128u, 11, -8, -19).XorshiftEngine;

aliasXorshift160 = XorshiftEngine!(uint, 160u, 2, -1, -4).XorshiftEngine;

aliasXorshift192 = XorshiftEngine!(uint, 192u, -2, 1, 4).XorshiftEngine;

aliasXorshift = XorshiftEngine!(uint, 128u, 11, -8, -19).XorshiftEngine;
DefineXorshiftEngine generators with well-chosen parameters. See each bits examples of "Xorshift RNGs".Xorshift is a Xorshift128's alias because 128bits implementation is mostly used.
Examples:
// Seed with a constantauto rnd =Xorshift(1);auto num = rnd.front;// same for each runwriteln(num);// 1405313047// Seed with an unpredictable valuernd.seed(unpredictableSeed);num = rnd.front;// different across rnd
nothrow @nogc @property @trusted uintunpredictableSeed();

templateunpredictableSeed(UIntType) if (isUnsigned!UIntType)
A "good" seed for initializing random number engines. InitializingwithunpredictableSeed makes engines generate differentrandom number sequences every run.
This function utilizes the systemcryptographically-secure pseudo-randomnumber generator (CSPRNG) orpseudo-random number generator (PRNG)where available and implemented (currentlyarc4random on applicable BSDsystems,getrandom on Linux orBCryptGenRandom on Windows) to generate“high quality” pseudo-random numbers – if possible.As a consequence, calling it may block under certain circumstances (typicallyduring early boot when the system's entropy pool has not yet beeninitialized).
On x86 CPU models which support theRDRAND instruction, that will be usedwhen no more specialized randomness source is implemented.
In the future, further platform-specific PRNGs may be incorporated.

WarningThis function must not be used for cryptographic purposes.Despite being implemented for certain targets, there are no guaranteesthat it sources its randomness from a CSPRNG.The implementation also includes a fallback option that provides very littlerandomness and is used when no better source of randomness is available orintegrated on the target system.As written earlier, this function only aims to provide randomness for seedingordinary (non-cryptographic) PRNG engines.

Returns:
A single unsigned integer seed value, different on each successive call

NoteIn general periodically 'reseeding' a PRNG does not improve its qualityand in some cases may harm it. For an extreme example the MersenneTwister has2 ^^ 19937 - 1 distinct states but afterseed(uint) iscalled it can only be in one of2 ^^ 32 distinct states regardless ofhow excellent the source of entropy is.

Examples:
auto rnd = Random(unpredictableSeed);auto n = rnd.front;staticassert(is(typeof(n) ==uint));
aliasRandom = MersenneTwisterEngine!(uint, 32LU, 624LU, 397LU, 31LU, 2567483615u, 11LU, 4294967295u, 7LU, 2636928640u, 15LU, 4022730752u, 18LU, 1812433253u).MersenneTwisterEngine;
The "default", "favorite", "suggested" random number generator type onthe current platform. It is an alias for one of the previously-definedgenerators. You may want to use it if (1) you need to generate somenice random numbers, and (2) you don't care for the minutiae of themethod being used.
nothrow @nogc @property ref @safe RandomrndGen();
Global random number generator used by various functions in thismodule whenever no generator is specified. It is allocated per-threadand initialized to an unpredictable value for each thread.
Returns:
A singleton instance of the default random number generator
Examples:
import std.algorithm.iteration : sum;import std.range : take;auto rnd =rndGen;assert(rnd.take(3).sum > 0);
autouniform(string boundaries = "[)", T1, T2)(T1a, T2b)
if (!is(CommonType!(T1, T2) == void));

autouniform(string boundaries = "[)", T1, T2, UniformRandomNumberGenerator)(T1a, T2b, ref UniformRandomNumberGeneratorurng)
if (isFloatingPoint!(CommonType!(T1, T2)) && isUniformRNG!UniformRandomNumberGenerator);

autouniform(string boundaries = "[)", T1, T2, RandomGen)(T1a, T2b, ref RandomGenrng)
if ((isIntegral!(CommonType!(T1, T2)) || isSomeChar!(CommonType!(T1, T2))) && isUniformRNG!RandomGen);
Generates a number betweena andb. Theboundariesparameter controls the shape of the interval (open vs. closed oneither side). Valid values forboundaries are"[]","(]","[)", and"()". The default intervalis closed to the left and open to the right. The version that does nottakeurng uses the default generatorrndGen.
Parameters:
T1alower bound of the uniform distribution
T2bupper bound of the uniform distribution
UniformRandomNumberGeneratorurng(optional) random number generator to use; if not specified, defaults torndGen
Returns:
A single random variate drawn from the uniform distribution betweena andb, whose type is the common type of these parameters
Examples:
auto rnd = Random(unpredictableSeed);// Generate an integer in [0, 1023]autoa =uniform(0, 1024, rnd);assert(0 <=a &&a < 1024);// Generate a float in [0, 1)autob =uniform(0.0f, 1.0f, rnd);assert(0 <=b &&b < 1);// Generate a float in [0, 1]b =uniform!"[]"(0.0f, 1.0f, rnd);assert(0 <=b &&b <= 1);// Generate a float in (0, 1)b =uniform!"()"(0.0f, 1.0f, rnd);assert(0 <b &&b < 1);
Examples:
Create an array of random numbers using range functions and UFCS
import std.array : array;import std.range : generate, takeExactly;int[] arr = generate!(() =>uniform(0, 100)).takeExactly(10).array;writeln(arr.length);// 10assert(arr[0] >= 0 && arr[0] < 100);
Examples:
import std.conv : to;import std.meta : AliasSeq;import std.range.primitives : isForwardRange;import std.traits : isIntegral, isSomeChar;auto gen = Mt19937(123_456_789);staticassert(isForwardRange!(typeof(gen)));autoa =uniform(0, 1024, gen);assert(0 <=a &&a <= 1024);autob =uniform(0.0f, 1.0f, gen);assert(0 <=b &&b < 1, to!string(b));auto c =uniform(0.0, 1.0);assert(0 <= c && c < 1);staticforeach (T; AliasSeq!(char,wchar,dchar,byte,ubyte,short,ushort,int,uint,long,ulong,float,double,real)){{    T lo = 0, hi = 100;// Try tests with each of the possible bounds    {        T init =uniform(lo, hi);        size_t i = 50;while (--i &&uniform(lo, hi) == init) {}assert(i > 0);    }    {        T init =uniform!"[)"(lo, hi);        size_t i = 50;while (--i &&uniform(lo, hi) == init) {}assert(i > 0);    }    {        T init =uniform!"(]"(lo, hi);        size_t i = 50;while (--i &&uniform(lo, hi) == init) {}assert(i > 0);    }    {        T init =uniform!"()"(lo, hi);        size_t i = 50;while (--i &&uniform(lo, hi) == init) {}assert(i > 0);    }    {        T init =uniform!"[]"(lo, hi);        size_t i = 50;while (--i &&uniform(lo, hi) == init) {}assert(i > 0);    }/* Test case with closed boundaries covering whole range     * of integral type     */staticif (isIntegral!T || isSomeChar!T)    {foreach (immutable _; 0 .. 100)        {auto u =uniform!"[]"(T.min, T.max);staticassert(is(typeof(u) == T));assert(T.min <= u,"Lower bound violation for uniform!\"[]\" with " ~ T.stringof);assert(u <= T.max,"Upper bound violation for uniform!\"[]\" with " ~ T.stringof);        }    }}}auto reproRng = Xorshift(239842);staticforeach (T; AliasSeq!(char,wchar,dchar,byte,ubyte,short,ushort,int,uint,long,ulong)){{    T lo = T.min + 10, hi = T.max - 10;    T init =uniform(lo, hi, reproRng);    size_t i = 50;while (--i &&uniform(lo, hi, reproRng) == init) {}assert(i > 0);}}{bool sawLB =false, sawUB =false;foreach (i; 0 .. 50)    {auto x =uniform!"[]"('a', 'd', reproRng);if (x == 'a') sawLB =true;if (x == 'd') sawUB =true;assert('a' <= x && x <= 'd');    }assert(sawLB && sawUB);}{bool sawLB =false, sawUB =false;foreach (i; 0 .. 50)    {auto x =uniform('a', 'd', reproRng);if (x == 'a') sawLB =true;if (x == 'c') sawUB =true;assert('a' <= x && x < 'd');    }assert(sawLB && sawUB);}{bool sawLB =false, sawUB =false;foreach (i; 0 .. 50)    {immutableint lo = -2, hi = 2;auto x =uniform!"()"(lo, hi, reproRng);if (x == (lo+1)) sawLB =true;if (x == (hi-1)) sawUB =true;assert(lo < x && x < hi);    }assert(sawLB && sawUB);}{bool sawLB =false, sawUB =false;foreach (i; 0 .. 50)    {immutableubyte lo = 0, hi = 5;auto x =uniform(lo, hi, reproRng);if (x == lo) sawLB =true;if (x == (hi-1)) sawUB =true;assert(lo <= x && x < hi);    }assert(sawLB && sawUB);}{foreach (i; 0 .. 30)    {        writeln(i);// uniform(i, i + 1, reproRng)    }}
autouniform(T, UniformRandomNumberGenerator)(ref UniformRandomNumberGeneratorurng)
if (!is(T == enum) && (isIntegral!T || isSomeChar!T) && isUniformRNG!UniformRandomNumberGenerator);

autouniform(T)()
if (!is(T == enum) && (isIntegral!T || isSomeChar!T));

autouniform(E, UniformRandomNumberGenerator)(ref UniformRandomNumberGeneratorurng)
if (is(E == enum) && isUniformRNG!UniformRandomNumberGenerator);

autouniform(E)()
if (is(E == enum));
Generates a uniformly-distributed number in the range[T.min,T.max] for any integral or character typeT. If no randomnumber generator is passed, uses the defaultrndGen.
If anenum is used as type, the random variate is drawn withequal probability from any of the possible values of the enumE.
Parameters:
UniformRandomNumberGeneratorurng(optional) random number generator to use; if not specified, defaults torndGen
Returns:
Random variate drawn from the uniform distribution across all possible values of the integral, character or enum typeT.
Examples:
auto rnd = MinstdRand0(42);writeln(rnd.uniform!ubyte);// 102writeln(rnd.uniform!ulong);// 4838462006927449017enum Fruit { apple, mango, pear }version (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147writeln(rnd.uniform!Fruit);// Fruit.mango
Tuniform01(T = double)()
if (isFloatingPoint!T);

Tuniform01(T = double, UniformRNG)(ref UniformRNGrng)
if (isFloatingPoint!T && isUniformRNG!UniformRNG);
Generates a uniformly-distributed floating point number of typeT in the range [0, 1). If no random number generator is specified, the default RNGrndGen will be used as the source of randomness.
uniform01 offers a faster generation of random variates than the equivalentuniform!"[)"(0.0, 1.0) and so may be preferred for some applications.
Parameters:
UniformRNGrng(optional) random number generator to use; if not specified, defaults torndGen
Returns:
Floating-point random variate of typeT drawn from the uniform distribution across the half-open interval [0, 1).
Examples:
import std.math.operations : feqrel;auto rnd = MinstdRand0(42);// Generate random numbers in the range in the range [0, 1)auto u1 =uniform01(rnd);assert(u1 >= 0 && u1 < 1);auto u2 = rnd.uniform01!float;assert(u2 >= 0 && u2 < 1);// Confirm that the random values with the initial seed 42 are 0.000328707 and 0.524587assert(u1.feqrel(0.000328707) > 20);assert(u2.feqrel(0.524587) > 20);
F[]uniformDistribution(F = double)(size_tn, F[]useThis = null)
if (isFloatingPoint!F);
Generates a uniform probability distribution of sizen, i.e., anarray of sizen of positive numbers of typeF that sum to1. IfuseThis is provided, it is used as storage.
Examples:
import std.algorithm.iteration : reduce;import std.math.operations : isClose;auto a =uniformDistribution(5);writeln(a.length);// 5assert(isClose(reduce!"a + b"(a), 1));a =uniformDistribution(10, a);writeln(a.length);// 10assert(isClose(reduce!"a + b"(a), 1));
ref autochoice(Range, RandomGen = Random)(Rangerange, ref RandomGenurng)
if (isRandomAccessRange!Range && hasLength!Range && isUniformRNG!RandomGen);

ref autochoice(Range)(Rangerange);

ref autochoice(Range, RandomGen = Random)(ref Rangerange, ref RandomGenurng)
if (isRandomAccessRange!Range && hasLength!Range && isUniformRNG!RandomGen);

ref autochoice(Range)(ref Rangerange);
Returns a random, uniformly chosen, elemente from the suppliedRange range. If no random number generator is passed, the defaultrndGen is used.
Parameters:
Rangerangea random access range that has thelength property defined
RandomGenurng(optional) random number generator to use; if not specified, defaults torndGen
Returns:
A single random element drawn from therange. If it can, it will return aref to therange element, otherwise it will return a copy.
Examples:
auto rnd = MinstdRand0(42);auto elem  = [1, 2, 3, 4, 5].choice(rnd);version (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147writeln(elem);// 3
RangerandomShuffle(Range, RandomGen)(Ranger, ref RandomGengen)
if (isRandomAccessRange!Range && isUniformRNG!RandomGen);

RangerandomShuffle(Range)(Ranger)
if (isRandomAccessRange!Range);
Shuffles elements ofr usinggen as a shuffler.r must bea random-access range with length. If no RNG is specified,rndGenwill be used.
Parameters:
Rangerrandom-access range whose elements are to be shuffled
RandomGengen(optional) random number generator to use; if not specified, defaults torndGen
Returns:
The shuffled random-access range.
Examples:
auto rnd = MinstdRand0(42);auto arr = [1, 2, 3, 4, 5].randomShuffle(rnd);version (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147writeln(arr);// [3, 5, 2, 4, 1]
RangepartialShuffle(Range, RandomGen)(Ranger, in size_tn, ref RandomGengen)
if (isRandomAccessRange!Range && isUniformRNG!RandomGen);

RangepartialShuffle(Range)(Ranger, in size_tn)
if (isRandomAccessRange!Range);
Partially shuffles the elements ofr such that upon returningr[0 .. n]is a random subset ofr and is randomly ordered.r[n .. r.length]will contain the elements not inr[0 .. n]. These will be in an undefinedorder, but will not be random in the sense that their order afterpartialShuffle returns will not be independent of their order beforepartialShuffle was called.
r must be a random-access range with length.n must be less thanor equal tor.length. If no RNG is specified,rndGen will be used.
Parameters:
Rangerrandom-access range whose elements are to be shuffled
size_tnnumber of elements ofr to shuffle (counting from the beginning); must be less thanr.length
RandomGengen(optional) random number generator to use; if not specified, defaults torndGen
Returns:
The shuffled random-access range.
Examples:
auto rnd = MinstdRand0(42);auto arr = [1, 2, 3, 4, 5, 6];arr = arr.dup.partialShuffle(1, rnd);version (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147assert(arr == [2, 1, 3, 4, 5, 6]);// 1<->2arr = arr.dup.partialShuffle(2, rnd);version (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147assert(arr == [1, 4, 3, 2, 5, 6]);// 1<->2, 2<->4arr = arr.dup.partialShuffle(3, rnd);version (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147assert(arr == [5, 4, 6, 2, 1, 3]);// 1<->5, 2<->4, 3<->6
size_tdice(Rng, Num)(ref Rngrnd, Num[]proportions...)
if (isNumeric!Num && isForwardRange!Rng);

size_tdice(R, Range)(ref Rrnd, Rangeproportions)
if (isForwardRange!Range && isNumeric!(ElementType!Range) && !isArray!Range);

size_tdice(Range)(Rangeproportions)
if (isForwardRange!Range && isNumeric!(ElementType!Range) && !isArray!Range);

size_tdice(Num)(Num[]proportions...)
if (isNumeric!Num);
Get a random index into a list of weights corresponding to each index
Similar to rolling a die with relative probabilities stored inproportions.Returns the index inproportions that was chosen.

NoteUsually, dice are 'fair', meaning that each side has equal probability to come up, in which case1 + uniform(0, 6) can simply be used. In future Phobos versions, this function might get renamed to something likeweightedChoice to avoid confusion.

Parameters:
Rngrnd(optional) random number generator to use; if not specified, defaults torndGen
Num[]proportionsforward range or list of individual values whose elements correspond to the probabilities with which to choose the corresponding index value
Returns:
Random variate drawn from the index values [0, ...proportions.length - 1], with the probability of getting an individual index valuei being proportional toproportions[i].
Examples:
auto d6  = 1 +dice(1, 1, 1, 1, 1, 1);// fair dice rollauto d6b = 1 +dice(2, 1, 1, 1, 1, 1);// double the chance to roll '1'auto x =dice(0.5, 0.5);// x is 0 or 1 in equal proportionsauto y =dice(50, 50);// y is 0 or 1 in equal proportionsauto z =dice(70, 20, 10);// z is 0 70% of the time, 1 20% of the time,// and 2 10% of the time
Examples:
autornd = MinstdRand0(42);auto z =rnd.dice(70, 20, 10);writeln(z);// 0z =rnd.dice(30, 20, 40, 10);writeln(z);// 2
structRandomCover(Range, UniformRNG = void) if (isRandomAccessRange!Range && (isUniformRNG!UniformRNG || is(UniformRNG == void)));

autorandomCover(Range, UniformRNG)(Ranger, auto ref UniformRNGrng)
if (isRandomAccessRange!Range && isUniformRNG!UniformRNG);

autorandomCover(Range)(Ranger)
if (isRandomAccessRange!Range);
Covers a given ranger in a random manner, i.e. goes through eachelement ofr once and only once, just in a random order.rmust be a random-access range with length.
If no random number generator is passed torandomCover, thethread-global RNG rndGen will be used internally.
Parameters:
Rangerrandom-access range to cover
UniformRNGrng(optional) random number generator to use; if not specified, defaults torndGen
Returns:
Range whose elements consist of the elements ofr, in random order. Will be a forward range if bothr andrng are forward ranges, aninput range otherwise.
Examples:
import std.algorithm.comparison : equal;import std.range : iota;auto rnd = MinstdRand0(42);version (D_LP64)// https://issues.dlang.org/show_bug.cgi?id=15147assert(10.iota.randomCover(rnd).equal([7, 4, 2, 0, 1, 6, 8, 3, 9, 5]));
structRandomSample(Range, UniformRNG = void) if (isInputRange!Range && (isUniformRNG!UniformRNG || is(UniformRNG == void)));

autorandomSample(Range)(Ranger, size_tn, size_ttotal)
if (isInputRange!Range);

autorandomSample(Range)(Ranger, size_tn)
if (isInputRange!Range && hasLength!Range);

autorandomSample(Range, UniformRNG)(Ranger, size_tn, size_ttotal, auto ref UniformRNGrng)
if (isInputRange!Range && isUniformRNG!UniformRNG);

autorandomSample(Range, UniformRNG)(Ranger, size_tn, auto ref UniformRNGrng)
if (isInputRange!Range && hasLength!Range && isUniformRNG!UniformRNG);
Selects a random subsample out ofr, containing exactlynelements. The order of elements is the same as in the originalrange. The total length ofr must be known. Iftotal ispassed in, the total number of sample is considered to betotal. Otherwise,RandomSample usesr.length.
Parameters:
Rangerrange to sample from
size_tnnumber of elements to include in the sample; must be less than or equal to the total number of elements inr and/or the parametertotal (if provided)
size_ttotal(semi-optional) number of elements ofr from which to select the sample (counting from the beginning); must be less than or equal to the total number of elements inr itself. May be omitted ifr has the.length property and the sample is to be drawn from all elements ofr.
UniformRNGrng(optional) random number generator to use; if not specified, defaults torndGen
Returns:
Range whose elements consist of a randomly selected subset of the elements ofr, in the same order as these elements appear inr itself. Will be a forward range if bothr andrng are forward ranges, an input range otherwise.
RandomSample implements Jeffrey Scott Vitter's Algorithm D(see Vitter1984,1987), which selects a sampleof sizen in O(n) steps and requiring O(n) random variates,regardless of the size of the data being sampled. The exceptionto this is if traversing k elements on the input range is itselfan O(k) operation (e.g. when sampling lines from an input file),in which case the sampling calculation will inevitably be ofO(total).
RandomSample will throw an exception iftotal is verifiablyless than the total number of elements available in the input,or ifn > total.
If no random number generator is passed torandomSample, thethread-global RNG rndGen will be used internally.
Examples:
import std.algorithm.comparison : equal;import std.range : iota;auto rnd = MinstdRand0(42);assert(10.iota.randomSample(3, rnd).equal([7, 8, 9]));
@property boolempty() const;

@property ref autofront();

voidpopFront();

@property typeof(this)save() const;

@property size_tlength() const;
Range primitives.
@property size_tindex();
Returns the index of the visited record.
Copyright © 1999-2026 by theD Language Foundation | Page generated byDdoc on Fri Feb 20 12:46:02 2026

[8]ページ先頭

©2009-2026 Movatter.jp