C ++ 11 Generieren von Zufallszahlen aus häufig wechselnden Bereichen

F: Wie erstelle ich (viele) gleichmäßig verteilte Ganzzahlen aus unbekannten Bereichen eines Priorats? Was ist der bevorzugte Weg in Bezug auf die Leistung (Millionen generierter Zahlen)?

Kontext: In meiner App muss ich an vielen Stellen viele Pseudozufallszahlen generieren. Ich verwende Singleton-Muster für den Generator, um die Reproduzierbarkeit des App-Laufs zu gewährleisten. In meinem Fall ist die Verteilung immer einheitlich, aber das Problem ist, dass es viel zu viele mögliche Bereiche gibt, um das Verteilungsobjekt im C ++ 11-Stil vorab zu erstellen.

Was ich ausprobiert habe: Es gibt zwei offensichtliche Lösungen für dieses Problem: Erstens müssen einmalige Verteilungsobjekte vorhanden sein, und zweitens muss Modulo verwendet werden, um eine Zufallszahl aus einem möglichst großen Bereich in den gewünschten Bereich umzuwandeln. Aber irgendwie bezweifle ich, dass dies das Beste ist :)

#include <random>
#include <iostream>
#include "limits.h"
using namespace std;

mt19937 mt;
uniform_int_distribution<int> * fixedDist;
uniform_int_distribution<int> * variableDist;

// this version creates and delete dist after just one use
int getIntFromRange1(int from, int to){
    variableDist = new uniform_int_distribution<int>(from,to);
    int num = (*variableDist)(mt);
    delete variableDist;
    return num;
}

// this version contains modulo
int getIntFromRange2(int from, int to){
    int num = (*fixedDist)(mt);
    int diff = to - from;
    num = num % diff;
    return num + from;
}

int main(){ 
   mt.seed(123456);
   fixedDist= new uniform_int_distribution<int>(0,INT_MAX)

   int a = getIntFromRange1(1,10); // 1 and 10 are just for illustration
   int b = getIntFromRange2(1,10); // can change freely

   cout << "a: " << a << endl; // a: 6
   cout << "b: " << b << endl; // b: 9

   getchar();
}
Doppelte Frage

Variieren Sie den Bereich von uniform_int_distribution

Antworten auf die Frage(2)

Ihre Antwort auf die Frage