<random>
Definiuje działalność Generowanie liczb losowych umożliwia utworzenie równomiernie rozproszonej liczby losowe.
#include <random>
Podsumowanie
Element generator liczb losowych jest obiekt, który tworzy sekwencję pseudolosowego wartości.Generator, który tworzy wartości, które są równomiernie rozłożone w określonym zakresie jest jednolite generatora liczb losowych (URNG).Przeznaczone do działania jako URNG klasę szablonu jest określany jako aparat czy tej klasy ma pewne typowe cechy, które zostały omówione w tym artykule.Może być URNG — i jest zazwyczaj — w połączeniu z dystrybucji przez przekazanie URNG jako argument do dystrybucji operator() do tworzenia wartości, które są rozpowszechniane w taki sposób, który jest definiowana za pomocą dystrybucji.
Te łącza przejść do głównych sekcji tego artykułu:
Przykłady kodu
Lista kategorii
Aparaty i dystrybucji
Uwagi
Krótkie wskazówki
Oto kilka wskazówek, należy pamiętać, gdy jest używany <random>:
Dla większości zastosowań URNGs utworzyć pierwotne bitów, które muszą mieć kształt przy dystrybucji.(Istotnych wyjątkiem są std::shuffle() ponieważ bezpośrednio używa URNG.)
Pojedynczego wystąpienia URNG lub dystrybucji nie można bezpiecznie można wywołać jednocześnie, ponieważ działa URNG lub dystrybucji jest modyfikowanie operacji.Aby uzyskać więcej informacji, zobacz Bezpieczeństwo wątku w standardowej bibliotece C++.
Wstępnie zdefiniowane definicje typów aparatów kilka są udostępniane; jest to preferowany sposób tworzenia URNG, jeśli jest używany aparat.
Najbardziej przydatne parowania dla większości aplikacji jest mt19937 silnika z uniform_int_distribution, co zostało pokazane przykładowy kod później w tym artykule.
Istnieje wiele opcji do wyboru w <random> nagłówka i ich jest nieaktualna funkcji środowiska wykonawczego języka C rand().Aby uzyskać informacje o tym, co problem z rand() i w jaki sposób <random> odpowiedzi na te braki zobacz w tym wideo.
Przykłady
W poniższym przykładzie pokazano, jak można wygenerować niektóre liczby losowe w takim przypadku pięciu z nimi za pomocą generator utworzone za pomocą inicjatora niedeterministyczne.
#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;
}
Dane wyjściowe:
Gdy są one liczby losowe wysokiej jakości i różnych za każdym razem, gdy ten program jest uruchomiony, nie są musi być przydatne zakresu.Aby sterować z zakresu, użyj jednolite dystrybucji, jak pokazano w następującym kodzie:
#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;
}
Dane wyjściowe:
Następny przykładowy kod przedstawia bardziej realistyczne zestaw przypadków użycia z równomiernie rozproszonej losowe generatorów numer rekonfiguracja zawartość wektor i tablicy.
// 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);
}
Przykład danych wyjściowych i uwagi kodu
Ten kod ilustruje dwóch różnych randomizations — losowo wektora liczb całkowitych i losowo tablicy indeksowanej danych — przy użyciu funkcji szablonu testu.Pierwszym wywołaniu funkcji testu używa zabezpieczyć kryptografii, niedeterministyczne, nie seedable, powtarzalnych URNG random_device.Drugi test Uruchom używa mersenne_twister_engine jako URNG, z deterministyczne inicjatora stałych 32-bitowy, co oznacza wyniki są powtarzalne.Test trzeci Uruchom nasion mersenne_twister_engine z wynikiem niedeterministyczne 32-bitowe z random_device.Przebieg testu czwarte rozszerzenie to za pomocą obsługiwał sekwencji z random_device wyników, które skutecznie zapewnia powyżej losowości niedeterministyczne 32-bitowe (, ale nadal nie kryptografii secure).Aby uzyskać więcej informacji Czytaj dalej.
[Przejdź do góry strony]
Lista kategorii
Jednolite losowe generatorów numer
URNGs często są opisane w zakresie tych właściwości:
Długość okresu: ile iteracji zajmie powtórzeń wygenerowany numery.Długość lepiej.
Wydajność: jak szybko można wygenerować liczb i ilość pamięci zajmuje.Im mniejsza lepiej.
Jakość: jak najbliższa true liczby losowe jest wygenerowany sekwencji.Jest to często "losowości".
Poniższe sekcje list jednolite losowo numer generatorów (URNGs) w <random> nagłówka.
[Przejdź do góry strony]
Generator niedeterministyczne
Generuje niedeterministyczne bezpiecznego kryptograficznie losowych sekwencji za pomocą zewnętrznego urządzenia.Zwykle używany do generowania aparatu.Niska wydajność, bardzo wysokiej jakości.Aby uzyskać więcej informacji, zobacz uwagi. |
[Przejdź do góry strony]
Definicje typów aparat z parametrami wstępnie zdefiniowanych
Do tworzenia wystąpienia aparaty i adapterów aparatu.Aby uzyskać więcej informacji, zobacz aparaty i dystrybucji.
Nazwa |
Opis |
---|---|
default_random_engine |
Wpisz definicję domyślny aparat.
|
knuth_b |
Aparat Knuth.
|
minstd_rand0 |
1988 minimalne standardowe aparat (Lewis Goodman i Miller, 1969).
|
minstd_rand |
Zaktualizowanego aparatu standardowe minimalne minstd_rand0 (wstrzymywanie Miller i Stockmeyer, 1993).
|
mt19937 |
32-bitowy ramach projektu Mersenne — trąba powietrzna aparat (Matsumoto i Nishimura, 1998).
|
mt19937_64 |
64-bitowy ramach projektu Mersenne — trąba powietrzna aparat (Matsumoto i Nishimura, 2000).
|
ranlux24 |
Aparat RANLUX 24-bitowe (Martin Lüscher i James Fred, 1994).
|
ranlux24_base |
Używany jako bazowy dla ranlux24.
|
ranlux48 |
Aparat RANLUX 48-bitowe (Martin Lüscher i James Fred, 1994).
|
ranlux48_base |
Używany jako bazowy dla ranlux48.
|
[Przejdź do góry strony]
Aparat szablonów
Aparat szablonów są używane jako autonomicznej URNGs lub jako podstawowej aparatów przekazany do silnika adapterów.Zazwyczaj te są utworzone za pomocą elementów wstępnie zdefiniowane typedef aparat i przekazany do dystrybucji.Aby uzyskać więcej informacji, zobacz aparaty i dystrybucji sekcji.
Generuje losowe sekwencje przy użyciu algorytmu congruential liniowo.Najbardziej simplistic i najniższej jakości. |
|
Generuje losowe sekwencje przy użyciu algorytmu twister w ramach projektu Mersenne.Najbardziej złożonego, i jest najwyższej jakości, z wyjątkiem klasy random_device.Bardzo szybko wydajności. |
|
Generuje losowe sekwencje przy użyciu algorytmu Odejmij z przenoszące.Usprawnienia w linear_congruential_engine, ale dużo niższe jakości i wydajność w porównaniu mersenne_twister_engine. |
[Przejdź do góry strony]
Aparat szablonów Adapter
Aparat karty są szablony dostosowanych innych aparatów (podstawowy).Zazwyczaj te są utworzone za pomocą elementów wstępnie zdefiniowane typedef aparat i przekazany do dystrybucji.Aby uzyskać więcej informacji, zobacz aparaty i dystrybucji sekcji.
Generuje losowe sekwencje przez odrzucenie wartości zwracane przez jego podstawową aparatu. |
|
Generuje losowe sekwencji z określonej liczby bitów, przepakowaniu bitów przy użyciu wartości zwracane przez jego podstawowy aparat. |
|
Generuje losowe sekwencji, zmiana kolejności wartości zwracane z jego podstawową aparatu. |
[Przejdź do początku sekcji]
[Przejdź do góry strony]
Losowo numer dystrybucji
Poniższe sekcje list dystrybucji w <random> nagłówka.Dystrybucji są mechanizm przetwarzania końcowego, zazwyczaj przy użyciu danych wyjściowych URNG jako dane wejściowe i rozpowszechnianie danych wyjściowych przez funkcję zdefiniowanych rozkładu statystycznych.Aby uzyskać więcej informacji, zobacz aparaty i dystrybucji sekcji.
[Przejdź do góry strony]
Jednolite dystrybucji
Tworzy dystrybucji wartość całkowitą jednolite dla zakresu w interwale [, b] zamknięte (wraz z wartościami granicznymi-wraz z wartościami granicznymi). |
|
Tworzy jednolite rzeczywistym dystrybucji wartość (zmiennoprzecinkowa) dla zakresu w interwale [a, (b) (wraz z wartościami granicznymi otwarty). |
|
Tworzy rozdziel wartości rzeczywistych (zmiennoprzecinkowych) danego dokładności między [0, 1) (wraz z wartościami granicznymi otwarty). |
[Przejdź do początku sekcji]
Rozkład Bernoulliego
Tworzy rozkładu Bernoulli'ego dla bool wartości. |
|
Tworzy dwumianowy wartości Liczba całkowita. |
|
Tworzy geometryczne dystrybucji z wartości całkowitych. |
|
Tworzy ujemny dwumianowy, z wartości całkowitych. |
[Przejdź do początku sekcji]
Normalny dystrybucji
Tworzy rozkładu Cauchy wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy rozkładem wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy rozkładu F (znanego także jako jego Snedecor F dystrybucji lub dystrybucji Fishera — Snedecor) wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy dziennik normalny rozkład wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy normalnego dystrybucji (gaussowskie) wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy studenta t-dystrybucji wartości rzeczywistych (zmiennoprzecinkowych). |
[Przejdź do początku sekcji]
Rozkład Poissona
Tworzy wykładniczej dystrybucji wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy wartość extreme dystrybucji wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy rozkładu gamma wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy rozkładu Poissona z wartości całkowitych. |
|
Tworzy rozkładu Weibulla wartości rzeczywistych (zmiennoprzecinkowych). |
[Przejdź do początku sekcji]
Rozkład próbki
Tworzy dystrybucji dyskretnych liczbę całkowitą. |
|
Tworzy piecewise dystrybucji stałej wartości rzeczywistych (zmiennoprzecinkowych). |
|
Tworzy piecewise liniowo dystrybucji wartości rzeczywistych (zmiennoprzecinkowych). |
[Przejdź do początku sekcji]
[Przejdź do góry strony]
Funkcje pomocnicze
Ta sekcja zawiera listę funkcji narzędzia ogólne zawarte w <random> nagłówka.
Generuje sekwencję-obciążona inicjatora zaszyfrowany.Używany w celu uniknięcia replikacji losowe variate strumieni.Przydatne, gdy URNGs wiele wystąpień z aparatów. |
Operatory
W tej sekcji wyświetla operatorów w <random> nagłówka.
operator== |
Sprawdza, czy URNG po lewej stronie operatora jest taki sam, jak aparat po prawej stronie. |
operator!= |
Sprawdza, czy URNG po lewej stronie operatora nie równa się aparatu po prawej stronie. |
operator<< |
Zapisuje informacje o stanie w strumieniu. |
operator>> |
Wyodrębnia informacje o stanie ze strumienia. |
[Przejdź do góry strony]
Aparaty i dystrybucji
Można znaleźć w następujących sekcjach informacje dotyczące każdej z tych kategorii klasy szablonu zdefiniowany w <random>.Obu tych kategoriach klasy szablonu podejmuje typu jako argumentu oraz nazwy parametrów szablonu współużytkowanego do opisu właściwości typu, które są dozwolone jako typ argumentu rzeczywistych, w następujący sposób:
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.
RealTypeWskazuje float, double, lub long double.
Silniki
Aparaty i silnika adapterów szablonów, której parametry dostosować generator utworzone.
Aparat jest klasy lub klasy szablonu, którego wystąpienia (generatorów) pełnić rolę źródła liczby losowe równomiernie rozłożone wartość minimalną i maksymalną.Adapter aparat oferuje szereg wartości, które mają różne losowości właściwości według wartości biorąc utworzonej przez niektóre inne losowe aparat numer i stosowanie algorytm pewnego rodzaju do tych wartości.
Każdy aparat i aparatu łącznik ma następujących elementów:
typedef numeric-type result_typejest to typ zwracany przez generator operator().numeric-type Została przekazana jako parametr szablonu przy tworzeniu wystąpienia.
result_type operator()Zwraca wartości, które mogą być równomiernie rozłożone pomiędzy min() i max().
result_type min()Zwraca wartość minimalna, który jest zwracany przez generator operator().Aparat adapterów korzystać z podstawową aparatu min() wynik.
result_type max()Zwraca wartość maksymalna, który jest zwracany przez generator operator().Gdy result_type jest typem całkowitym (wartości całkowitych) max() jest maksymalna wartość, która faktycznie można zwrócić (włącznie); Po result_type jest zmiennoprzecinkowych typu (zwracającej real), max() jest najmniejsza wartość większą niż wszystkich wartości, które mogą być zwrócone (bez-wraz z wartościami granicznymi).Aparat adapterów korzystać z podstawową aparatu max() wynik.
void seed(result_type s)generator z wartością inicjatora nasiona s.Dla aparatów, podpis jest void seed(result_type s = default_seed) obsługi parametr domyślny (adapterów aparat zdefiniować oddzielne void seed(), zobacz podsekcji).
template <class Seq> void seed(Seq& q) seeds the generator by using a seed_seqSeq.
Jawne konstruktora z argumentem result_type x który tworzy generator obsługiwany tak, jakby przez wywołanie elementu seed(x).
Jawne konstruktora z argumentem seed_seq& seq który tworzy generator obsługiwany tak, jakby przez wywołanie elementu seed(seq).
void discard(unsigned long long count) effectively calls operator()count times and discards each value.
Aparat adapterów obsługuje również te elementy członkowskie (Engine jest pierwszy parametr szablonu adaptera aparat wyznaczające aparat bazowy typ):
Domyślny konstruktor zainicjowania generatora tak, jakby z aparat podstawową domyślnego konstruktora.
Jawne konstruktora z argumentem const Engine& eng.Jest to do obsługi tworzenia kopii za pomocą aparatu podstawowy.
Jawne konstruktora z argumentem Engine&& eng.Ma to obsługuje konstruowania przenoszenia za pomocą aparatu podstawowy.
void seed()które inicjuje generator z wartością inicjatora domyślny aparat podstawowy.
const Engine& base()Właściwość funkcję, która zwraca podstawowy aparat, który został użyty do budowy generatora.
Każdy silnik utrzymuje stanu określający kolejność wartości, które będą generowane przez kolejnych wywołań operator().Stany generatorów dwa wystąpienia z aparatów tego samego typu można porównać przy użyciu operator== i operator!=.Jeśli porównać dwa stany jako równe, wygeneruje taką samą sekwencję wartości.Stan obiektu można zapisać w strumieniu jako sekwencja wartości bez znaku 32-bitowych przy użyciu operator<< generatora.Stan nie ulega zmianie po zapisaniu go.Zapisanego stanu mogą być odczytywane w generator utworzonych na podstawie tego samego typu silnika przy użyciu operator>>.
[Przejdź do góry strony]
Dystrybucji
Element dystrybucji jest klasy lub szablonu klasy, których wystąpienia transform strumień równomiernie rozproszonej liczby losowe uzyskany z aparatu na strumień liczby losowe, która ma określoną dystrybucji.Każdy dystrybucji zawiera następujące elementy:
typedef numeric-type result_typeTyp zwracany przez dystrybucji jest operator().numeric-type Została przekazana jako parametr szablonu przy tworzeniu wystąpienia.
template <class URNG> result_type operator()(URNG& gen)Zwraca wartości, które są rozpowszechniane zgodnie z definicją dystrybucji, korzystając z gen jako źródło równomiernie rozproszonej losowych wartości i zapisana parametry rozkładu.
template <class URNG> result_type operator()(URNG& gen, param_type p)Zwraca wartości dystrybuowane zgodnie z definicją dystrybucji, za pomocą gen jako źródło równomiernie rozproszonej losowych wartości i struktury parametrów p.
typedef unspecified-type param_typePakiet parametrów opcjonalnie przekazania do operator() i służy do generowania jego wartość zwracana zamiast przechowywane parametry.
Element const param& Konstruktor inicjuje przechowywane parametry z jej argument.
param_type param() constpobiera parametry składowanej.
void param(const param_type&)Ustawia parametry przechowywane z jej argument.
result_type min()Zwraca minimalną wartość zwracaną przez dystrybucji operator().
result_type max()Zwraca maksymalną wartość zwracaną przez dystrybucji operator().Gdy result_type jest typem całkowitym (wartości całkowitych) max() jest maksymalna wartość, która faktycznie można zwrócić (włącznie); Po result_type jest zmiennoprzecinkowych typu (zwracającej real), max() jest najmniejsza wartość większą niż wszystkich wartości, które mogą być zwrócone (bez-wraz z wartościami granicznymi).
void reset()odrzuca wszelkie wartości pamięci podręcznej, tak aby wyniku następnym wywołaniu operator() nie zależy od wartości uzyskane z aparatu przed wywołaniem.
Struktura parametru jest obiekt, który przechowuje wszystkie parametry niezbędnych do dystrybucji.Zawiera:
typedef distribution-type distribution_type, który jest typem jego dystrybucji.
Wyświetla co najmniej jeden konstruktorów ten sam parametr jako stopień wykorzystania konstruktorów dystrybucji.
Dostęp do parametru funkcji dystrybucji.
Operatory porównania równości i nierówności.
Aby uzyskać więcej informacji zobacz tematy podrzędne odwołania poniżej tego, połączone wcześniej w tym artykule.
[Przejdź do góry strony]
Uwagi
Istnieją dwie URNGs bardzo przydatne w programie Visual Studio —mt19937 i random_device, jak pokazano w tej tabeli porównania:
URNG |
Szybkie? |
Kryptografii zabezpieczyć? |
Seedable? |
Deterministyczne? |
---|---|---|---|---|
mt19937 |
Tak |
Nie |
Tak |
Tak* |
random_device |
Nie |
Tak |
Nie |
Nie |
* Jeśli dołączonym do znanego inicjatora.
Chociaż ISO C++ Standard nie wymaga random_device być kryptograficznie bezpieczne, w programie Visual Studio jest zaimplementowana aby kryptograficznie można zabezpieczyć.(Termin "kryptograficznie bezpiecznego" oznacza gwarancji, ale odwołuje się do minimalnego poziomu entropii — i w związku z tym, poziom przewidywalność — zapewnia to algorytm danego losowe generowanie.Aby uzyskać więcej informacji, zobacz artykuł Wikipedia kryptograficznie bezpiecznego generator liczb pseudorandom.) Ponieważ ISO C++ Standard nie wymaga to, innych platform może wdrożyć random_device jako proste pseudolosowego generator liczb (nie kryptograficznie bezpieczny) i maja tylko umożliwiać jako źródło inicjatora generator innego.Zapoznaj się z dokumentacją na te platformy podczas korzystania z random_device w kodzie między platformami.
Zgodnie z definicją random_device wyniki nie są do odtworzenia, a efekt po stronie jest, że może być znacznie wolniej niż innych URNGs.Większość aplikacji, które nie są wymagane, aby kryptograficznie można zabezpieczyć użyj mt19937 lub podobny silnika, chociaż warto ją zalążek w wyniku wywołania random_device, co zostało pokazane przykładowy kod.
[Przejdź do góry strony]