2016-10-26 3 views
1

Ich habe zwei Fragen über die Generierung von Zahlen/einzelne Zeichen mit bestimmten Verteilungen.Generieren Sie Zeichen mit gegebener Verteilung

  1. Wie kann ich die Laplace-Verteilung in C++ implementieren? Ich weiß, dass es in der Boost-Bibliothek verfügbar ist, aber sagen wir, ich kann es nicht benutzen. Außerdem sehe ich es nicht in der Standardbibliothek von c + 11.
  2. Wenn ich Text von Zeichen mit normaler Verteilung erzeugen muss, wird Casting doppelte Zahl zu int und dann zu char-Typ tun den Trick?

    std::default_random_engine generator; 
    std::normal_distribution<double> distribution(112.0,5.0); 
    int number = (int)distribution(generator); 
    // a-z characters 
    if(number >= 97 && number <= 122) return (char)number; 
    else generate once again; 
    

Hoffnung für Ihre Hilfe.

+0

konstruiert werden Warum nicht eine normale Verteilung von '‚A'' zu '‘ Z'' erstellen (oder deren Nieder- Falläquivalente)? Beachten Sie, dass es nur für z. ASCII oder andere Kodierungen, bei denen die Buchstaben zusammenhängend kodiert sind. –

+0

hast du das schon ausprobiert? Was ist dein Problem mit dieser Lösung? – Hayt

+0

Wenn Sie die Lösung von Boost nicht verwenden können.org, warum denkst du, dass du eine Lösung von StackOverflow.com verwenden kannst? Die Lizenzen sind nicht so unterschiedlich. – MSalters

Antwort

1

1) Laplace-Verteilung hat explizite Dichte (siehe here), die eine Funktion von $ \ mathbf {R} $ bis $ [0,1] $ ist, mit Parametern, die Sie daher in c++ als Mitglied implementieren können Funktion einer Klasse, deren Member-Variablen beispielsweise die Parameter der Distribution enthalten würden. Etwas wie:

class LaplaceRandomVariable 
{ 
    double _b; 
    double _mu; 
    public: 
     LaplaceRandomVariable(double b, double mu) 
     { 
      _b = b; 
      _mu = mu; 
     } 
     double Distribution(double x) const 
     { 
      return (0.5/_b) * exp(-abs(x - _mu)/_b); //you'll need error checking for _b could be zero 
     } 

}; 

, um Ihnen ein Bild zu geben.

2) Was die Normalverteilung betrifft, haben normale Zufallsvariablen Werte in $ \ mathbf {R} $ und damit auch ihre Verteilung. Anstatt double s zu int 's zu verwenden, würde ich lieber eine diskrete Approximation der normalen Zufallsvariablen mit gegebenem Mittelwert und Varianz durch binäre Zufallsvariablen verwenden. (Siehe zum Beispiel this.) Grob gesagt, würden Sie gerne eine Normalverteilung sehen, würde Ihre Zahl von char s gegen unendlich neigen. Genau dafür ist die vorgenannte Binomialapproximation vorgesehen.

Genauer gesagt: Betrachten Sie die $ B (n, p) $ - Verteilung (wikipedia Notationen für uns, um eine gemeinsame Basis zu haben). Wenn n gegen $ + \ infty $ konvergiert, tendiert $ B (n, p) $ dazu, sich der Normalverteilung $ N (np, np (1-p)) $ anzunähern. Sie erhalten den Mittelwert m und die Varianz v der Normalverteilung Ihre char s müssen als verteilt werden. Also m = np und und v = np (1-p). Wie B (n, p) ist mit Werten in der Menge {0, ..., n} und char s span {97, ..., 122} = {0, ..., 25} +97 (+ eine Translation anzeigen), nehmen Sie n = 25. Dies induziert p = m/25 und v = m * (1-m/25). Sie simulieren also B (m/25, m * (1-m/25)) mit Werten in {0, ..., 25} und erzeugen jeweils int in {0, ..., 25} Sie werden 97 hinzufügen, und Sie werden static_cast<char> dieses int, um die entsprechende char zu erhalten.

An diesem Punkt bleibt es, B (n, p) mit zuvor begründeten Werten für n und p zu simulieren. Und dafür, fühlen Sie sich frei zu verwenden:

http://www.cplusplus.com/reference/random/binomial_distribution/

+0

Vielen Dank für Ihre Antwort. 2. Ich werde dann Binomialverteilung verwenden. Es ist auch in der Standardbibliothek implementiert und wird somit noch einfacher. 1. Und wie kann ich es mit 'std :: default_random_engine generator' verwenden? Oder irgendeine andere Funktion, so dass ich zufällige Zeichen erzeugen könnte, die dieser Verteilung (Generator) ähnlich sind. Auch ich möchte es verwenden, um Zeichen in dem gegebenen Bereich zu generieren. Ich schätze, die einzige Möglichkeit besteht darin, nach int zu char-Typ zu konvertieren? –

+0

Ich werde meine Antwort bearbeiten, damit sie Antworten auf die Frage Ihres Kommentars enthält. –

+0

Nochmals vielen Dank. Wie auch immer ich meine Antwort für meine erste Frage meinte: P. Wie kann ich Zeichen/Integer mit Laplace-Verteilung unter Verwendung der von Ihnen angegebenen LaplaceRandomVariable-Klasse generieren. Ich möchte etwas ähnliches erreichen wie "Verteilung (Generator)", bereitgestellt von der Standardbibliothek. Ist es möglich? –

0

Während ich alle bin mit Binomial mit für Briefe Probenahme (man könnte genauso gut auf Poisson sehen, aber die Varianz ist ein bisschen weg, glaube ich)

Wrt Laplace-Verteilung, könnte es von C++ 11 Standard-Stücke entlang der Linien

std::default_random_engine generator; 

template <typename gen> double 
sample_laplace(double mu, double b, gen& generator) { 
    std::uniform_real_distribution<double> rng(0.0, 1.0); 

    double x = -std::log(1.0 - rng(generator)) * b; 
    if (rng(generator) < 0.5) 
     x = -x; 

    return x + mu; 
} 
Verwandte Themen