<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:
Délka období: kolik iterací trvá opakovat posloupnost čísel vygenerován.Čím delší lepší.
Výkon: jak rychle čísla mohou být generována a kolik paměti trvá.Tím menší lepší.
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
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.
|
knuth_b |
Modul Knuth.
|
minstd_rand0 |
1988 minimální standardní modul (Lewis, Goodman a Millerová, 1969).
|
minstd_rand |
Aktualizované minimální standardní modul minstd_rand0 (Park, Miller a Stockmeyer, 1993).
|
mt19937 |
32bitový Mersenne twister modul (Matsumoto a Nishimura, 1998).
|
mt19937_64 |
64-bit Mersenne twister engine (Matsumoto and Nishimura, 2000).
|
ranlux24 |
24bitový RANLUX modul (Martin Lüscher a Fred James, 1994).
|
ranlux24_base |
Použít jako základ pro ranlux24.
|
ranlux48 |
48-bit RANLUX engine (Martin Lüscher and Fred James, 1994).
|
ranlux48_base |
Použít jako základ pro ranlux48.
|
[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.
Generuje náhodné pořadí pomocí lineární congruential algoritmus.Většina zneužívající vlastností prohlížeče a nejnižší kvality. |
|
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. |
|
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.
Generuje náhodné pořadí zrušením hodnoty vrácené jeho základní modul. |
|
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. |
|
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
Vytvoří rozdělení jednotné celočíselnou hodnotu v rámci rozsahu v intervalu [a, b] Uzavřeno (včetně – včetně). |
|
Vytváří jednotné reálná hodnota (plovoucí desetinnou čárkou) distribuce v rámci rozsahu v intervalu [a b) (včetně výlučný). |
|
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
Vytvoří Bernoulliho rozdělení bool hodnoty. |
|
Vytváří binomické rozdělení celočíselné hodnoty. |
|
Vytváří geometrické distribuce celočíselné hodnoty. |
|
Vytváří negativní binomické rozdělení celočíselné hodnoty. |
[Přejděte do horní části]
Normální distribuce
Vytváří Cauchy distribuce hodnot reálné (plovoucí desetinnou čárkou). |
|
Vytváří rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
|
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). |
|
Vytváří protokol normální rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
|
Vytváří normálního (Gaussovské) rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
|
Vytvoří Student získal t-rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
[Přejděte do horní části]
Distribuce náhodných
Vytváří exponenciálním výskyt hodnoty reálné (plovoucí desetinnou čárkou). |
|
Vytvoří extreme hodnotu rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
|
Vytváří gama rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
|
Vytváří náhodných rozdělení celočíselné hodnoty. |
|
Vytváří Weibullova rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
[Přejděte do horní části]
Vzorkování distribuce
Vytváří rozdělení diskrétní celé číslo. |
|
Vytvoří piecewise konstantní rozdělení hodnot reálné (plovoucí desetinnou čárkou). |
|
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í.
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]