repetir rango numeros generar como aleatorios c++ random c++11

rango - C++ 11 números aleatorios



numeros aleatorios sin repetir en c (3)

Necesito generar números aleatorios, pero desde el rango más amplio posible (al menos 64 bits). No me importa si la distribución es perfecta, por lo que std::rand() funcionaría, pero solo devuelve un int . Entiendo que c ++ 11 tiene alguna capacidad de generación de números aleatorios que puede dar cualquier número de tamaño, pero es muy complejo de usar. ¿Puede alguien publicar un ejemplo simple de cómo usarlo de la manera más simple posible para obtener la funcionalidad descrita (64 bits o más números aleatorios) de la manera más simple posible (como std::rand() )?


Esta es la forma de usar la generación de números aleatorios de C ++ 11 para este propósito (ajustado desde http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution ):

#include <random> #include <iostream> int main() { /* Initialise. Do this once (not for every random number). */ std::random_device rd; std::mt19937_64 gen(rd()); /* This is where you define the number generator for unsigned long long: */ std::uniform_int_distribution<unsigned long long> dis; /* A few random numbers: */ for (int n=0; n<10; ++n) std::cout << dis(gen) << '' ''; std::cout << std::endl; return 0; }

En lugar de unsigned long long , puede usar std::uintmax_t de cstdint para obtener el mayor rango de enteros posible (sin usar una biblioteca real de enteros grandes).


No C ++ 11, pero bastante fácil

((unsigned long long)rand() << 32) + rand() Aquí generamos dos partes de int64 como int32''s

Como JasonD señaló, asume que rand() genera un entero de 32 bits. Es admisible a xor rand() << x , rand() << (2*x) , rand() << (3*x) , etc., donde x <= bit está en generar por rand() número` También debería estar bien.


Podríamos envolver fácilmente un motor generador de números aleatorios en métodos similares a srand / rand como este:

#include <random> #include <iostream> struct MT19937 { private: static std::mt19937_64 rng; public: // This is equivalent to srand(). static void seed(uint64_t new_seed = std::mt19937_64::default_seed) { rng.seed(new_seed); } // This is equivalent to rand(). static uint64_t get() { return rng(); } }; std::mt19937_64 MT19937::rng; int main() { MT19937::seed(/*put your seed here*/); for (int i = 0; i < 10; ++ i) std::cout << MT19937::get() << std::endl; }

(Como srand y rand , a esta implementación no le importa la seguridad de subprocesos).

Bueno, las funciones de la envoltura son tan triviales que podrías usar el motor directamente.

#include <random> #include <iostream> static std::mt19937_64 rng; int main() { rng.seed(/*put your seed here*/); for (int i = 0; i < 10; ++ i) std::cout << rng() << std::endl; }