C ++ 11 Generación de números aleatorios a partir del rango que cambia con frecuencia

P: ¿Cómo genero (muchos) enteros distribuidos uniformemente a partir de rangos desconocidos anteriormente? ¿Cuál es la forma preferida en términos de rendimiento (millones de números generados)?

Contexto: en mi aplicación tengo que generar muchos números pseudoaleatorios en muchos lugares. Uso un patrón singleton para el generador para mantener la reproducibilidad de la ejecución de la aplicación. La distribución siempre es uniforme en mi caso, pero el problema es que hay demasiados rangos posibles para prefabricar el objeto de distribución en estilo C ++ 11.

Lo que probé: hay dos soluciones obvias para esto, la primera es tener objetos de distribución de una sola vez y la segunda es usar un módulo para transformar un número aleatorio del rango más amplio posible al deseado. Pero de alguna manera dudo que estos sean los mejores posibles :)

#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();
}
Pregunta duplicada

Variar el rango de uniform_int_distribution

Respuestas a la pregunta(2)

Su respuesta a la pregunta