Freigeben über


piecewise_constant_distribution-Klasse

Generiert eine stückweise konstante Verteilung mit Intervallen von variierender Weite und in jedem Intervall eindeutiger Wahrscheinlichkeit.

Syntax

template<class RealType = double>
class piecewise_constant_distribution
   {
public:
   // types
   typedef RealType result_type;
   struct param_type;

   // constructor and reset functions
   piecewise_constant_distribution();
   template <class InputIteratorI, class InputIteratorW>
   piecewise_constant_distribution(
       InputIteratorI firstI, InputIteratorI lastI, InputIteratorW firstW);
   template <class UnaryOperation>
   piecewise_constant_distribution(
      initializer_list<result_type> intervals, UnaryOperation weightfunc);
   template <class UnaryOperation>
   piecewise_constant_distribution(
      size_t count, result_type xmin, result_type xmax, UnaryOperation weightfunc);
   explicit piecewise_constant_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<result_type> intervals() const;
   vector<result_type> densities() const;
   param_type param() const;
   void param(const param_type& parm);
   result_type min() const;
   result_type max() const;
   };

Parameter

RealType
Der Gleitkommaergebnistyp. Der Standardwert ist double. Mögliche Typen finden Sie unter <"zufällig>".

Hinweise

Die Sampling-Verteilung weist Intervalle von variierender Breite und in jedem Intervall eindeutiger Wahrscheinlichkeit auf. Informationen über weitere Sampling-Verteilungen erhalten Sie unter piecewise_linear_distribution-Klasse und discrete_distribution.

Die folgende Tabelle ist mit Artikeln über einzelne Member verknüpft:

piecewise_constant_distribution
param_type

Die Eigenschaftsfunktion intervals() gibt einen vector<result_type> mit dem Satz gespeicherter Intervalle der Verteilung zurück.

Die Eigenschaftsfunktion densities() gibt einen vector<result_type> mit den für jeden Intervallsatz gespeicherten Dichten zurück, die entsprechend den in den Konstruktorparametern genannten Gewichten berechnet werden.

Das Eigenschaftsmember param() gibt das aktuell gespeicherte Verteilungspaket param_type zurück oder legt es fest.

Die min()- und max()-Memberfunktion gibt das jeweils kleinst- und größtmögliche Ergebnis zurück.

Die reset()-Memberfunktion verwirft alle zwischengespeicherten Werte, damit das Ergebnis des folgenden Aufrufs von operator() nicht von Werten abhängig ist, die vor dem Aufruf aus der Engine bezogen wurden.

Die operator()-Memberfunktionen geben den nächsten generierten Wert von entweder dem aktuellen oder dem spezifizierten Parameterpaket zurück, das auf der URNG-Engine basiert.

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);

    // Three intervals, non-uniform: 0 to 1, 1 to 6, and 6 to 15
    vector<double> intervals{ 0, 1, 6, 15 };
    // weights determine the densities used by the distribution
    vector<double> weights{ 1, 5, 10 };

    piecewise_constant_distribution<double> distr(intervals.begin(), intervals.end(), weights.begin());

    cout << endl;
    cout << "min() == " << distr.min() << endl;
    cout << "max() == " << distr.max() << endl;
    cout << "intervals (index: interval):" << endl;
    vector<double> i = distr.intervals();
    int counter = 0;
    for (const auto& n : i) {
        cout << fixed << setw(11) << counter << ": " << setw(14) << setprecision(10) << n << endl;
        ++counter;
    }
    cout << endl;
    cout << "densities (index: density):" << endl;
    vector<double> d = distr.densities();
    counter = 0;
    for (const auto& n : d) {
        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 << '-' << elem.first+1 << ' ' << 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() == 15
intervals (index: interval):
          0:   0.0000000000
          1:   1.0000000000
          2:   6.0000000000
          3:  15.0000000000
densities (index: density):
          0:   0.0625000000
          1:   0.0625000000
          2:   0.0694444444
Distribution for 100 samples:
    0-1 :::::::
    1-2 ::::::
    2-3 :::::
    3-4 ::::::
    4-5 :::::::
    5-6 ::::::
    6-7 :::
    7-8 ::::::::::
    8-9 ::::::
    9-10 ::::::::::::
    10-11 :::::
    11-12 ::::::
    12-13 :::::::::
    13-14 ::::
    14-15 ::::::::

Anforderungen

Header:<random>

Namespace: std

piecewise_constant_distribution::piecewise_constant_distribution

Erstellt die Verteilung.

// default constructor
piecewise_constant_distribution();

// constructs using a range of intervals, [firstI, lastI), with
// matching weights starting at firstW
template <class InputIteratorI, class InputIteratorW>
piecewise_constant_distribution(InputIteratorI firstI, InputIteratorI lastI, InputIteratorW firstW);

// constructs using an initializer list for range of intervals,
// with weights generated by function weightfunc
template <class UnaryOperation>
piecewise_constant_distribution(initializer_list<RealType>
intervals, UnaryOperation weightfunc);

// constructs using an initializer list for range of count intervals,
// distributed uniformly over [xmin,xmax] with weights generated by function weightfunc
template <class UnaryOperation>
piecewise_constant_distribution(size_t count, RealType xmin, RealType xmax, UnaryOperation weightfunc);

// constructs from an existing param_type structure
explicit piecewise_constant_distribution(const param_type& parm);

Parameter

firstI
Ein Eingabeiterator für das erste Element im Verteilungsbereich.

lastI
Ein Eingabeiterator für das letzte Element im Verteilungsbereich.

firstW
Ein Eingabeiterator für das erste Element im Gewichtsbereich.

Zeitintervalle
Ein initializer_list mit den Verteilungsintervallen.

count
Die Anzahl von Elementen im Verteilungsbereich.

xmin
Der niedrigste Wert im Verteilungsbereich.

xmax
Der höchste Wert im Verteilungsbereich. Muss größer als xmin sein.

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 Parameterstruktur.

Hinweise

Der Standardkonstruktor legt die gespeicherten Parameter so fest, dass es nur ein Intervall, 0 bis 1, mit einer Wahrscheinlichkeitsdichte von 1 gibt.

Der Iteratorbereichskonstruktor

template <class InputIteratorI, class InputIteratorW>
piecewise_constant_distribution(InputIteratorI firstI, InputIteratorI lastI,
    InputIteratorW firstW);

erstellt ein Verteilungsobjekt mit Intervallen von Iteratoren über die Sequenz [firstI, lastI) und einer passenden Gewichtssequenz, die mit firstW beginnt.

Der Initialisiererlistenkonstruktor

template <class UnaryOperation>
piecewise_constant_distribution(initializer_list<result_type>
intervals,
    UnaryOperation weightfunc);

erstellt ein Verteilungsobjekt mit Intervallen aus den Initialisierungslistenintervallen und Gewichtungen, die aus der Gewichtungsfunktion generiert werden.

Der als

template <class UnaryOperation>
piecewise_constant_distribution(size_t count, result_type xmin, result_type xmax,
    UnaryOperation weightfunc);

erstellt ein Verteilungsobjekt mit Zählungsintervallen , die einheitlich über [ xmin,xmax] verteilt werden, wobei jede Intervallgewichtung gemäß der Funktion gewichtsfunc zugewiesen wird, und weightfunc muss einen Parameter akzeptieren und einen Rückgabewert haben, der beide konvertierbar doublesind. Vorbedingung:xmin < xmax

Der als

explicit piecewise_constant_distribution(const param_type& parm);

erstellt ein Verteilungsobjekt mithilfe des Parms als gespeicherte Parameterstruktur.

piecewise_constant_distribution::param_type

Speichert alle Parameter der Verteilung.

struct param_type {
   typedef piecewise_constant_distribution<result_type> distribution_type;
   param_type();
   template <class IterI, class IterW>
   param_type(IterI firstI, IterI lastI, IterW firstW);
   template <class UnaryOperation>
   param_type(size_t count, result_type xmin, result_type xmax, UnaryOperation weightfunc);
   std::vector<result_type> densities() const;
   std::vector<result_type> intervals() const;

   bool operator==(const param_type& right) const;
   bool operator!=(const param_type& right) const;
   };

Parameter

Siehe Konstruktorparameter für piecewise_constant_distribution.

Hinweise

Vorbedingung:xmin < xmax

Diese Struktur kann bei der Instanziierung an den Klassenkonstruktor des Verteilers, an die Memberfunktion param() (zur Festlegung der gespeicherten Parameter einer vorhandenen Verteilung) und an operator() (zur Verwendung anstelle der gespeicherten Parameter) übergeben werden.

Siehe auch

<random>
piecewise_linear_distribution