discrete_distribution-Klasse
Generiert eine diskrete Ganzzahlverteilung mit Intervallen von gleicher Breite und in jedem Intervall eindeutiger Wahrscheinlichkeit.
Syntax
template<class IntType = int>
class discrete_distribution
{
public:
// types
typedef IntType result_type;
struct param_type;
// constructor and reset functions
discrete_distribution();
template <class InputIterator>
discrete_distribution(InputIterator firstW, InputIterator lastW);
discrete_distribution(initializer_list<double> weightlist);
template <class UnaryOperation>
discrete_distribution(size_t count, double xmin, double xmax, UnaryOperation funcweight);
explicit discrete_distribution(const param_type& parm);
void reset();
// generating functions
template <class URNG>
result_type operator()(URNG& gen);
template <class URNG>
result_type operator()(URNG& gen, const param_type& parm);
// property functions
vector<double> probabilities() const;
param_type param() const;
void param(const param_type& parm);
result_type min() const;
result_type max() const;
};
Parameter
IntType
Der Ganzzahlergebnistyp. Der Standardwert ist int
. Mögliche Typen finden Sie unter <"zufällig>".
Hinweise
Die Sampling-Verteilung weist Intervalle von gleicher Breite und in jedem Intervall eindeutiger Wahrscheinlichkeit auf. Informationen zu weiteren Sampling-Verteilungen finden Sie unter piecewise_linear_distribution Class (piecewise_linear_distribution-Klasse) und piecewise_constant_distribution Class (piecewise_constant_distribution-Klasse).
Die folgende Tabelle ist mit Artikeln über einzelne Member verknüpft:
discrete_distribution
param_type
Die Eigenschaftsfunktion vector<double> probabilities()
gibt die einzelnen Eigenschaften für jede generierte Ganzzahl zurück.
Weitere Informationen zu Verteilungsklassen und ihren Mitgliedern finden Sie unter <"zufällig>".
Beispiel
// compile with: /EHsc /W4
#include <random>
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
using namespace std;
void test(const int s) {
// uncomment to use a non-deterministic generator
// random_device rd;
// mt19937 gen(rd());
mt19937 gen(1701);
discrete_distribution<> distr({ 1, 2, 3, 4, 5 });
cout << endl;
cout << "min() == " << distr.min() << endl;
cout << "max() == " << distr.max() << endl;
cout << "probabilities (value: probability):" << endl;
vector<double> p = distr.probabilities();
int counter = 0;
for (const auto& n : p) {
cout << fixed << setw(11) << counter << ": " << setw(14) << setprecision(10) << n << endl;
++counter;
}
cout << endl;
// generate the distribution as a histogram
map<int, int> histogram;
for (int i = 0; i < s; ++i) {
++histogram[distr(gen)];
}
// print results
cout << "Distribution for " << s << " samples:" << endl;
for (const auto& elem : histogram) {
cout << setw(5) << elem.first << ' ' << string(elem.second, ':') << endl;
}
cout << endl;
}
int main()
{
int samples = 100;
cout << "Use CTRL-Z to bypass data entry and run using default values." << endl;
cout << "Enter an integer value for the sample count: ";
cin >> samples;
test(samples);
}
Use CTRL-Z to bypass data entry and run using default values.
Enter an integer value for the sample count: 100
min() == 0
max() == 4
probabilities (value: probability):
0: 0.0666666667
1: 0.1333333333
2: 0.2000000000
3: 0.2666666667
4: 0.3333333333
Distribution for 100 samples:
0 :::
1 ::::::::::::::
2 ::::::::::::::::::
3 :::::::::::::::::::::::::::::
4 ::::::::::::::::::::::::::::::::::::
Anforderungen
Header:<random>
Namespace: std
discrete_distribution::discrete_distribution
Erstellt die Verteilung.
// default constructor
discrete_distribution();
// construct using a range of weights, [firstW, lastW)
template <class InputIterator>
discrete_distribution(InputIterator firstW, InputIterator lastW);
// construct using an initializer list for range of weights
discrete_distribution(initializer_list<double> weightlist);
// construct using unary operation function
template <class UnaryOperation>
discrete_distribution(size_t count, double low, double high, UnaryOperation weightfunc);
// construct from an existing param_type structure
explicit discrete_distribution(const param_type& parm);
Parameter
firstW
Der erste Iterator in der Liste, aus der die Verteilung konstruiert werden soll.
lastW
Der letzte Iterator in der Liste, aus der die Verteilung konstruiert werden soll (nicht inklusiv, da Iteratoren für das Ende ein leeres Element verwenden).
weightlist
Die initializer_list, aus der die Verteilung erstellt werden soll.
count
Die Anzahl von Elementen im Verteilungsbereich. Wenn count==0
ist, äquivalent zum Standardkonstruktor (generiert immer Null).
low
Der niedrigste Wert im Verteilungsbereich.
high
Der höchste Wert im Verteilungsbereich.
weightfunc
Das Objekt, das die Wahrscheinlichkeitsfunktion für die Verteilung darstellt. Sowohl der Parameter als auch der Rückgabewert müssen in double
konvertierbar sein.
parm
Die für die Erstellung der Verteilung verwendete param_type
-Struktur.
Hinweise
Der Standardkonstruktor erstellt ein Objekt, dessen gespeicherter Wahrscheinlichkeitswert ein Element mit dem Wert 1 aufweist. Dies führt zu einer Verteilung, die immer Null generiert.
Der Iteratorbereichskonstruktor mit den Parametern firstW und lastW erstellt mithilfe von Gewichtungswerten, die den Iteratoren während der Intervallsequenz [firstW, lastW] entnommen werden, ein Verteilungsobjekt.
Der Initialisierungslistenkonstruktor mit einem Weightlist-Parameter erstellt ein Verteilungsobjekt mit Gewichtungen aus der Gewichtungsliste der Initialisiererliste.
Der Konstruktor mit den Parametern count, low, high und weightfunc erstellt ein Verteilungsobjekt, das anhand der folgenden Regeln initialisiert wird:
- Wenn Anzahl< 1, n = 1 und als solches dem Standardkonstruktor entspricht, wird immer Null generiert.
- Wenn Anzahl> 0, n = zählen. Vorausgesetzt d = (hoch - niedrig) / n ist größer als Null, wobei d uniform Subranges verwendet wird, wird jede Gewichtung wie folgt zugewiesen:
weight[k] = weightfunc(x)
, wobei x = low + k * d + / 2, for k = 0, ..., n - 1.
Der Konstruktor mit einem param_type
-Parameter parm erstellt ein Verteilungsobjekt und verwendet dabei parm als gespeicherte Parameterstruktur.
discrete_distribution::param_type
Speichert alle Parameter der Verteilung.
struct param_type {
typedef discrete_distribution<result_type> distribution_type;
param_type();
// construct using a range of weights, [firstW, lastW)
template <class InputIterator>
param_type(InputIterator firstW, InputIterator lastW);
// construct using an initializer list for range of weights
param_type(initializer_list<double> weightlist);
// construct using unary operation function
template <class UnaryOperation>
param_type(size_t count, double low, double high, UnaryOperation weightfunc);
std::vector<double> probabilities() const;
bool operator==(const param_type& right) const;
bool operator!=(const param_type& right) const;
};
Parameter
firstW
Der erste Iterator in der Liste, aus der die Verteilung konstruiert werden soll.
lastW
Der letzte Iterator in der Liste, aus der die Verteilung konstruiert werden soll (nicht inklusiv, da Iteratoren für das Ende ein leeres Element verwenden).
weightlist
Die initializer_list, aus der die Verteilung erstellt werden soll.
count
Die Anzahl von Elementen im Verteilungsbereich. Wenn count 0 ist, entspricht dies dem Standardkonstruktor (generiert immer Null).
low
Der niedrigste Wert im Verteilungsbereich.
high
Der höchste Wert im Verteilungsbereich.
weightfunc
Das Objekt, das die Wahrscheinlichkeitsfunktion für die Verteilung darstellt. Sowohl der Parameter als auch der Rückgabewert müssen in double
konvertierbar sein.
right
Das mit diesem param_type
-Objekt zu vergleichende Objekt.
Hinweise
Dieses Parameterpaket kann an operator()
übergeben werden, um den Rückgabewert zu generieren.