Sdílet prostřednictvím


<random>

Definuje zařízení pro generování náhodných čísel, umožňující vytvoření stejnoměrně distribuované náhodná čísla.

#include <random>

Shrnutí

Objekt náhodné číslo generátor je objekt, který vytváří sekvenci pseudonáhodného hodnot.Generátor, který vytváří hodnoty, které jsou rovnoměrně rozložen v zadaném rozsahu je jednotné náhodné číslo generátor (URNG).Třída šablony slouží jako URNG se označuje jako stroj Pokud tuto třídu má některé běžné vlastnosti, které jsou popsány dále v tomto článku.Může být URNG – a je obvykle – kombinovat s distribuce předáním URNG jako argument se distribuce operator() k vytvoření hodnoty, které jsou distribuovány způsobem, který je definován pomocí distribuce.

Tyto odkazy přejít na hlavní částech tohoto článku:

  • Příklady kódu

  • Seznam podle kategorií

  • Moduly a distribuce

  • Poznámky

Tipy

Zde jsou některé tipy pro mějte na paměti při použití <random>:

  • Pro většinu účelů vytvořit URNGs nezpracovanou bitů, které musí být ve tvaru podle distribuce.(Důležitých výjimkou jsou std::shuffle() vzhledem k tomu, že využívá přímo URNG.)

  • Jeden konkretizaci URNG nebo distribuce nelze bezpečně volat souběžně vzhledem k tomu, že běží URNG nebo distribuce je úprava operace.Další informace naleznete v tématu Bezpečný přístup z více vláken ve standardní knihovně C++.

  • Předdefinované funkce typedef několik modulů jsou poskytovány; Toto je preferovaný způsob, jak vytvořit URNG, pokud modul, který je používán.

  • Velmi užitečné párování pro většinu aplikací mt19937 modulu s uniform_int_distribution, jak je znázorněno v příklad kódu dále v tomto článku.

Existuje mnoho možností můžete vybrat z v <random> záhlaví a některého z nich je vhodnější funkci zastaralý C Runtime rand().Informace o čem je problém s rand() a jak <random> řeší tyto nedostatky, naleznete v části toto video.

Příklady

Následující příklad kódu ukazuje, jak generovat některé náhodná čísla v tomto případě pěti z nich pomocí generátor vytvořen s determinizaci počáteční hodnoty.

#include <random>
#include <iostream>

using namespace std;

int main()
{
    random_device rd;   // non-deterministic generator
    mt19937 gen(rd());  // to seed mersenne twister.
                        // replace the call to rd() with a
                        // constant value to get repeatable
                        // results.

    for (int i = 0; i < 5; ++i) {
        cout << gen() << " "; // print the raw output of the generator.
    }
    cout << endl;
}

Výstup:

  

I když tyto jsou vysoce kvalitní náhodná čísla a jiné pokaždé, když tento program je spuštěn, nejsou nemusí být v rozsahu užitečné.Chcete-li řídit rozsahu, používejte jednotné rozdělení, jak je znázorněno v následujícím kódu:

#include <random>
#include <iostream>

using namespace std;

int main()
{
    random_device rd;   // non-deterministic generator
    mt19937 gen(rd());  // to seed mersenne twister.
    uniform_int_distribution<> dist(1,6); // distribute results between 1 and 6 inclusive.

    for (int i = 0; i < 5; ++i) {
        cout << dist(gen) << " "; // pass the generator to the distribution.
    }
    cout << endl;
}

Výstup:

  

Další příklad kódu ukazuje více realistické sadu případů použití s rovnoměrně distribuované generátory náhodných čísel přesouvání obsah vektor a pole.

// cl.exe /EHsc /nologo /W4 /MTd
#include <algorithm>
#include <array>
#include <iostream>
#include <random>
#include <string>
#include <vector>
#include <functional> // ref()

using namespace std;

template <typename C> void print(const C& c) {
    for (const auto& e : c) {
        cout << e << " ";
    }

    cout << endl;
}

template <class URNG>
void test(URNG& urng) {

    // Uniform distribution used with a vector
    // Distribution is [-5, 5] inclusive
    uniform_int_distribution<int> dist(-5, 5);
    vector<int> v;

    for (int i = 0; i < 20; ++i) {
        v.push_back(dist(urng));
    }

    cout << "Randomized vector: ";
    print(v);

    // Shuffle an array 
    // (Notice that shuffle() takes a URNG, not a distribution)
    array<string, 26> arr = { { "H", "He", "Li", "Be", "B", "C", "N", "O", "F",
        "Ne", "Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc",
        "Ti", "V", "Cr", "Mn", "Fe" } };

    shuffle(arr.begin(), arr.end(), urng);

    cout << "Randomized array: ";
    print(arr);
    cout << "--" << endl;
}

int main()
{
    // First run: non-seedable, non-deterministic URNG random_device
    // Slower but crypto-secure and non-repeatable.
    random_device rd;
    cout << "Using random_device URNG:" << endl;
    test(rd);

    // Second run: simple integer seed, repeatable results
    cout << "Using constant-seed mersenne twister URNG:" << endl;
    mt19937 engine1(12345);
    test(engine1);

    // Third run: random_device as a seed, different each run
    // (Desirable for most purposes)
    cout << "Using non-deterministic-seed mersenne twister URNG:" << endl;
    mt19937 engine2(rd());
    test(engine2);

    // Fourth run: "warm-up" sequence as a seed, different each run
    // (Advanced uses, allows more than 32 bits of randomness)
    cout << "Using non-deterministic-seed \"warm-up\" sequence mersenne twister URNG:" << endl;
    array<unsigned int, mt19937::state_size> seed_data;
    generate_n(seed_data.begin(), seed_data.size(), ref(rd));
    seed_seq seq(begin(seed_data), end(seed_data));
    mt19937 engine3(seq);
    test(engine3);
}

Příklad výstupu a poznámky kódu

  

Tento kód ukazuje dva různé randomizations – náhodně vektor celých čísel a náhodně pole indexovaná data – s funkcí test šablony.První volání funkce testovací používá kryptografických zabezpečit, nedeterministické, není seedable, opakovatelné URNG random_device.Druhý test spustit používá mersenne_twister_engine jako URNG, s deterministický konstantní jádro 32 bitů, což znamená, výsledky jsou opakovatelné.Třetí test spustit semen mersenne_twister_engine s výsledkem determinizaci 32bitový z random_device.Čtvrtý testu rozbalí na tomto pomocí počáteční hodnoty sekvence vyplněno random_device výsledků, které účinně poskytuje více než 32-bit determinizaci náhodnost (, avšak ještě není kryptografických secure).Další informace najdete v.

[Přejděte do horní části stránky]

Seznam podle kategorií

Jednotné generátory náhodných čísel

URNGs jsou popsány často z hlediska tyto vlastnosti:

  1. Délka období: kolik iterací trvá opakovat posloupnost čísel vygenerován.Čím delší lepší.

  2. Výkon: jak rychle čísla mohou být generována a kolik paměti trvá.Tím menší lepší.

  3. Kvalita: jak blízko true náhodná čísla je generovaného sekvence.To je často volána "náhodnost".

Jednotné náhodné číslo generátory (URNGs) v seznamu níže uvedené části <random> záhlaví.

[Přejděte do horní části stránky]

Nedeterministické generátor

random_device – třída

Generuje náhodné pořadí determinizaci, kryptograficky zabezpečené pomocí externí zařízení.Obvykle bude použit k ohlašování modul.Nízký výkon, velmi vysoké kvality.Další informace naleznete v tématu poznámky.

[Přejděte do horní části stránky]

Modul funkce TypeDef se předdefinované parametry

Pro konkretizujete moduly a modul adaptéry.Další informace naleznete v tématu moduly a distribuce.

Name

Popis

default_random_engine

Zadejte definici pro výchozí modul.

typedef mt19937 default_random_engine;

knuth_b

Modul Knuth.

typedef shuffle_order_engine<minstd_rand0, 256> knuth_b;

minstd_rand0

1988 minimální standardní modul (Lewis, Goodman a Millerová, 1969).

typedef linear_congruential_engine<unsigned int, 16807, 0, 2147483647> minstd_rand0;

minstd_rand

Aktualizované minimální standardní modul minstd_rand0 (Park, Miller a Stockmeyer, 1993).

typedef linear_congruential_engine<unsigned int, 48271, 0, 2147483647> minstd_rand;

mt19937

32bitový Mersenne twister modul (Matsumoto a Nishimura, 1998).

typedef mersenne_twister_engine<unsigned int, 32, 624, 397, 
    31, 0x9908b0df, 
    11, 0xffffffff, 
    7, 0x9d2c5680, 
    15, 0xefc60000, 
    18, 1812433253> mt19937;

mt19937_64

64-bit Mersenne twister engine (Matsumoto and Nishimura, 2000).

typedef mersenne_twister_engine<unsigned long long, 64, 312, 156, 
    31, 0xb5026f5aa96619e9ULL, 
    29, 0x5555555555555555ULL, 
    17, 0x71d67fffeda60000ULL, 
    37, 0xfff7eee000000000ULL, 
    43, 6364136223846793005ULL> mt19937_64;

ranlux24

24bitový RANLUX modul (Martin Lüscher a Fred James, 1994).

typedef discard_block_engine<ranlux24_base, 223, 23> ranlux24;

ranlux24_base

Použít jako základ pro ranlux24.

typedef subtract_with_carry_engine<unsigned int, 24, 10, 24> ranlux24_base;

ranlux48

48-bit RANLUX engine (Martin Lüscher and Fred James, 1994).

typedef discard_block_engine<ranlux48_base, 389, 11> ranlux48;

ranlux48_base

Použít jako základ pro ranlux48.

typedef subtract_with_carry_engine<unsigned long long, 48, 5, 12> ranlux48_base;

[Přejděte do horní části stránky]

Modul šablony

Modul šablony slouží jako samostatný URNGs nebo jako základní stroje předána modulu adaptéry.Obvykle jsou vytvořeny s předdefinovány definice typu modulu a předána distribuce.Další informace naleznete moduly a distribuce oddílu.

linear_congruential_engine – třída

Generuje náhodné pořadí pomocí lineární congruential algoritmus.Většina zneužívající vlastností prohlížeče a nejnižší kvality.

mersenne_twister_engine – třída

Generuje náhodné pořadí pomocí algoritmu twister Mersenne.Nejsložitější, a je nejvyšší kvality s výjimkou random_device třídy.Velmi rychlé výkonu.

subtract_with_carry_engine – třída

Generuje náhodné pořadí pomocí algoritmu odečíst s provést.Zlepšení linear_congruential_engine, ale mnoho nižší kvality a výkon než mersenne_twister_engine.

[Přejděte do horní části stránky]

Modul adaptér šablony

Modul adaptéry jsou šablony, které se přizpůsobí další moduly (základní).Obvykle jsou vytvořeny s předdefinovány definice typu modulu a předána distribuce.Další informace naleznete moduly a distribuce oddílu.

discard_block_engine – třída

Generuje náhodné pořadí zrušením hodnoty vrácené jeho základní modul.

independent_bits_engine – třída

Generuje náhodné pořadí s zadaný počet bitů tak, že opětovném zabalení bitů z hodnoty vrácené jeho základní modul.

shuffle_order_engine – třída

Generuje náhodné pořadí tak, že změna uspořádání hodnoty vrácené jeho základní modul.

[Přejděte do horní části]

[Přejděte do horní části stránky]

Náhodné číslo distribuce

Distribuce v seznamu níže uvedené části <random> záhlaví.Distribuce jsou po zpracování mechanismus, obvykle pomocí URNG výstup jako vstup a distribuce výstup definované statistické nezáporné funkcí.Další informace naleznete moduly a distribuce oddílu.

[Přejděte do horní části stránky]

Jednotné distribuce

uniform_int_distribution – třída

Vytvoří rozdělení jednotné celočíselnou hodnotu v rámci rozsahu v intervalu [a, b] Uzavřeno (včetně – včetně).

uniform_real_distribution – třída

Vytváří jednotné reálná hodnota (plovoucí desetinnou čárkou) distribuce v rámci rozsahu v intervalu [a b) (včetně výlučný).

generate_canonical

Vytvoří rovnoměrně hodnot reálné (plovoucí desetinnou čárkou) daného přesnosti v rámci [0, 1) (včetně výlučný).

[Přejděte do horní části]

Bernoulliho distribuce

bernoulli_distribution – třída

Vytvoří Bernoulliho rozdělení bool hodnoty.

binomial_distribution – třída

Vytváří binomické rozdělení celočíselné hodnoty.

geometric_distribution – třída

Vytváří geometrické distribuce celočíselné hodnoty.

negative_binomial_distribution – třída

Vytváří negativní binomické rozdělení celočíselné hodnoty.

[Přejděte do horní části]

Normální distribuce

cauchy_distribution – třída

Vytváří Cauchy distribuce hodnot reálné (plovoucí desetinnou čárkou).

chi_squared_distribution – třída

Vytváří rozdělení hodnot reálné (plovoucí desetinnou čárkou).

fisher_f_distribution – třída

Vytváří rozdělením F (označovaného také rozdělení F Snedecor uživatele nebo distribuce Fisherovy – Snedecor) hodnot reálné (plovoucí desetinnou čárkou).

lognormal_distribution – třída

Vytváří protokol normální rozdělení hodnot reálné (plovoucí desetinnou čárkou).

normal_distribution – třída

Vytváří normálního (Gaussovské) rozdělení hodnot reálné (plovoucí desetinnou čárkou).

student_t_distribution – třída

Vytvoří Student získal t-rozdělení hodnot reálné (plovoucí desetinnou čárkou).

[Přejděte do horní části]

Distribuce náhodných

exponential_distribution – třída

Vytváří exponenciálním výskyt hodnoty reálné (plovoucí desetinnou čárkou).

extreme_value_distribution – třída

Vytvoří extreme hodnotu rozdělení hodnot reálné (plovoucí desetinnou čárkou).

gamma_distribution – třída

Vytváří gama rozdělení hodnot reálné (plovoucí desetinnou čárkou).

poisson_distribution – třída

Vytváří náhodných rozdělení celočíselné hodnoty.

weibull_distribution – třída

Vytváří Weibullova rozdělení hodnot reálné (plovoucí desetinnou čárkou).

[Přejděte do horní části]

Vzorkování distribuce

discrete_distribution – třída

Vytváří rozdělení diskrétní celé číslo.

piecewise_constant_distribution – třída

Vytvoří piecewise konstantní rozdělení hodnot reálné (plovoucí desetinnou čárkou).

piecewise_linear_distribution – třída

Vytvoří piecewise lineární rozdělení hodnot reálné (plovoucí desetinnou čárkou).

[Přejděte do horní části]

[Přejděte do horní části stránky]

Pomocné funkce

V této části jsou uvedeny obecné nástroje funkce k dispozici ve <random> záhlaví.

seed_seq – třída

Vygeneruje posloupnost-předpětím kódovanou počáteční hodnoty.Chcete-li předejít replikace datových proudů náhodné variate použít.Užitečné, pokud mnoho URNGs jsou vytvářeny instance z moduly.

Operátory

V této části jsou uvedeny operátory poskytnutými <random> záhlaví.

operator==

Ověřuje, zda URNG na levé straně operátoru rovná modul na pravé straně.

operator!=

Ověřuje, zda URNG na levé straně operátor není rovno modul na pravé straně.

operator<<

Zapíše informace o stavu do datového proudu.

operator>>

Extrahuje informace o stavu z datového proudu.

[Přejděte do horní části stránky]

Moduly a distribuce

Informace naleznete v následujících částech informace o každé z těchto kategorií třída šablony definované v <random>.Oba z těchto kategorií třída šablony trvat typ jako argument a názvy parametrů sdílené šablony slouží k popisu vlastnosti typu, které jsou povoleny jako typ skutečného argumentu takto:

  • IntTypeindicates a short, int, long, long long, unsigned short, unsigned int, unsigned long, or unsigned long long.

  • UIntTypeindicates unsigned short, unsigned int, unsigned long, or unsigned long long.

  • RealTypeUrčuje, float, double, nebo long double.

Moduly

Moduly a modulu adaptéry jsou šablony, jejíž parametry přizpůsobit generátor vytvořen.

Stroj je distribuován třídy nebo třída šablony, jejichž instance (generátory) fungovat jako zdroj náhodná čísla rovnoměrně mezi minimální a maximální hodnotu.Modul adaptér přináší řadu hodnoty, které mají různé náhodnost vlastnosti podle hodnot trvá vytvořeného náhodné číslo modul a použití algoritmu určitého druhu na tyto hodnoty.

Každý modul a modul adaptér obsahuje následující členy:

  • typedef numeric-type result_typeje typu, který je vrácen generátoru operator().numeric-type Je předán jako parametr šablony při vytváření instance.

  • result_type operator()Vrátí hodnoty, které jsou rovnoměrně mezi min() a max().

  • result_type min()Vrátí minimální hodnotu, která je vrácena generátorem na operator().Modul adaptéry používají základní modul min() výsledek.

  • result_type max()vrací maximální hodnotu, která je vrácena generátorem na operator().Při result_type nedílnou typu (celočíselný), max() je maximální hodnota, která může být vrácena (včetně); Při result_type s plovoucí desetinnou čárkou (reálné komplexními hodnotami) typu, max() je nejmenší hodnotu větší než všechny hodnoty, které mohou být vráceny (bez – včetně).Modul adaptéry používají základní modul max() výsledek.

  • void seed(result_type s)Osazuje generátor s hodnotou jádro s.Pro moduly, podpis je void seed(result_type s = default_seed) pro podporu výchozí hodnota parametru (modul adaptéry definovat samostatnou void seed(), naleznete v části Další dílčí).

  • template <class Seq> void seed(Seq& q) seeds the generator by using a seed_seqSeq.

  • Explicitní konstruktor s argumentem result_type x , vytvoří generátor nasadí jakoby My volání seed(x).

  • Explicitní konstruktor s argumentem seed_seq& seq , vytvoří generátor nasadí jakoby My volání seed(seq).

  • void discard(unsigned long long count) effectively calls operator()count times and discards each value.

Modul adaptéry dále podporovat tyto členy (Engine je první parametr šablony adaptér stroj, určující typ základní modul):

  • Výchozí konstruktor k inicializaci generátor jako z základní modul výchozí konstruktor.

  • Explicitní konstruktor s argumentem const Engine& eng.Toto je pro podporu vytváření kopie použití základní stroje.

  • Explicitní konstruktor s argumentem Engine&& eng.Toto je pro podporu vytváření přesunout pomocí základní stroje.

  • void seed()která inicializuje generátor základní modul výchozí počáteční hodnoty hodnotou.

  • const Engine& base()Vlastnost funkce, která vrací na základní modul, který byl použit k vytvoření generátor.

Každý modul udržuje stav , která určují pořadí hodnot, které budou vytvořeny následných volání operator().Stavy dvě generátory instancemi moduly stejného typu lze porovnat s použitím operator== a operator!=.Je-li dva stavy porovnat za shodné, vygeneruje se stejnou sekvenci hodnot.Stav objektu lze uložit do datového proudu jako posloupnost 32bitové hodnoty bez znaménka s použitím operator<< generátoru.Stav zůstanou nezměněna uložením.Do uloženého stavu může číst do generátor instancemi vyhledávacího stejného typu pomocí operator>>.

[Přejděte do horní části stránky]

Distribuce

Objekt distribuce je třídy nebo třída šablony, jejichž instance transformace datový proud stejnoměrně distribuované náhodná čísla získané z vyhledávacího do datového proudu náhodná čísla, které mají konkrétní distribuce.Každý rozdělení má následující členy:

  • typedef numeric-type result_typeje typ, který je vrácen distribučním operator().numeric-type Je předán jako parametr šablony při vytváření instance.

  • template <class URNG> result_type operator()(URNG& gen)Vrátí hodnoty, které jsou podle definice distribučním distribuována pomocí gen jako zdroj stejnoměrně distribuované náhodných hodnot a uložené parametry rozdělení.

  • template <class URNG> result_type operator()(URNG& gen, param_type p)Vrátí hodnoty distribuované v souladu s definicí distribuci pomocí gen jako zdroj stejnoměrně distribuované náhodných hodnot a strukturu parametry p.

  • typedef unspecified-type param_typebalíček parametry volitelně předaná operator() a namísto uložené parametry slouží ke generování jeho návratovou hodnotu.

  • Objekt const param& konstruktor inicializuje uložené parametry z jeho argumentem.

  • param_type param() constZíská uložené parametry.

  • void param(const param_type&)Nastaví uložené parametry z jeho argumentem.

  • result_type min()Vrátí minimální hodnotu, která je vrácena distribučním operator().

  • result_type max()vrací maximální hodnotu, která je vrácena distribučním operator().Při result_type nedílnou typu (celočíselný), max() je maximální hodnota, která může být vrácena (včetně); Při result_type s plovoucí desetinnou čárkou (reálné komplexními hodnotami) typu, max() je nejmenší hodnotu větší než všechny hodnoty, které mohou být vráceny (bez – včetně).

  • void reset()Zruší změny libovolné hodnoty uložené v mezipaměti tak, aby výsledek další volání operator() není závislá na všechny hodnoty získané ze stroje před voláním.

Struktura parametr je objekt, který ukládá všechny parametry, které jsou potřebné pro rozdělení.Obsahuje:

  • typedef distribution-type distribution_type, který je typem distribuce.

  • Jeden nebo více konstruktory, které berou stejný parametr jsou uvedeny jako vzít konstruktory distribuce.

  • Parametr přístup funkcí distribuce.

  • Operátory porovnání rovnosti a nerovnosti.

Další informace naleznete v tématu související témata referenční pod touto položkou propojené dříve v tomto článku.

[Přejděte do horní části stránky]

Poznámky

Existují dvě velmi užitečné URNGs v sadě Visual Studio –mt19937 a random_device, jak je znázorněno v této tabulce porovnání:

URNG

Rychlé?

Šifrování zabezpečit?

Seedable?

Deterministický?

mt19937

Ano

Ne

Ano

Ano*

random_device

Ne

Ano

Ne

Ne

* Při opatřeného známé počáteční hodnoty.

Ačkoli ISO C++ Standard nevyžaduje random_device k zabezpečeny kryptograficky, v sadě Visual Studio je implementována kryptograficky třeba zabezpečit.("Kryptograficky zabezpečené" termín neznamená záruky, ale odkazuje na minimální úroveň entropie – a proto úroveň předvídatelnost – poskytuje daný náhodného algoritmus.Další informace naleznete v článku Wikipedia kryptograficky zabezpečené Generátor pseudonáhodných čísel.) Vzhledem k tomu, že ISO C++ Standard nevyžaduje to, může implementovat jiné platformy random_device jako jednoduchý pseudonáhodného číslo Generátoru (není bezpečné kryptograficky) a může pouze být vhodné jako zdroj počáteční hodnoty pro jiné generátor.Při použití naleznete v dokumentaci k tyto platformy random_device v kódu napříč platformami.

Podle definice random_device výsledky nejsou reprodukovat a vedlejší účinek je, že může výrazně pomalejší než ostatní URNGs spuštěny.Většina aplikací, které nemusí být kryptograficky zabezpečit použití mt19937 nebo podobná modulu, i když chcete jej počáteční hodnoty s voláním funkce random_device, jak je znázorněno v příklad kódu.

[Přejděte do horní části stránky]

Viz také

Další zdroje

Standardní knihovna C++ – hlavičkové soubory