2008-08-03 10 views
34

Estoy buscando un RNG rentable y razonablemente robusto que no utilice hardware especial. Puede usar métodos matemáticos (Mersenne Twister, etc.), puede "recoger entropía" de la máquina, lo que sea. En Linux/etc tenemos un drand48() que genera 48 bits aleatorios. Me gustaría una función/clase similar para C++ o C# que pueda generar más de 32 bits de aleatoriedad y que los bits de bajo orden sean tan aleatorios como los de orden alto.Robusta generación de números aleatorios

No tiene que ser criptográficamente seguro, pero no debe usar o estar basado en el lenguaje C rand() o .NET System.Random.

Se agradecerá cualquier código fuente, enlaces a la fuente, etc. En su defecto, ¿qué tipo de RNG debería estar buscando?

+0

'¿Por qué no System.Random'? Sé que 'rand' es pobre, ¿el' System.Random' también es pobre? Si es así, es triste :( –

+3

La justificación para cerrar esta pregunta no parece correcta en absoluto. – bames53

+0

@ bames53 He publicado un voto de reapertura ahora. Parece que también tienes suficiente representante, hazlo. :-D –

Respuesta

27

Para C++, Boost.Random es probablemente lo que estás buscando. Tiene soporte para MT (entre muchos otros algoritmos) y puede recopilar entropía a través de la clase nondet_random. ¡Echale un vistazo! :-)

8

The Gnu Scientific Library (GSL) tiene un conjunto bastante amplio de generadores RN, arnés de prueba, etc. Si está en Linux, probablemente ya esté disponible en su sistema.

7

Tenga cuidado con la Biblioteca Científica Gnu. Está licenciado bajo la GPL en lugar de LGPL.

Como mencionan otras personas, las clases aleatorias de Boost son un buen comienzo. Su aplicación se ajusta al código PRNG programado para TR1:

http://www.boost.org/doc/libs/1_35_0/libs/random/index.html http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1452.html

Si usted tiene una versión reciente del compilador G ++, es posible que las bibliotecas TR1 ya incluidos

2

Boost.Random es mi primera opción RNG para

http://www.boost.org/doc/libs/random

+0

Usted podría encontrar Boost al azar simplemente buscando en Google por eso no proporcionaría ningún enlace. Ahora lo he actualizado con el enlace a lib. –

5

C++ 11 ha adoptado una biblioteca de números aleatorios robusto basado en alza .aleatorio. Puede acceder a una cantidad de motores de números aleatorios usando diferentes algoritmos para cumplir con los requisitos de calidad, velocidad o tamaño. Las implementaciones de calidad incluso proporcionarán acceso a cualquier RNG no determinista que su plataforma ofrezca a través del std::random_device.

Además, hay muchos adaptadores para producir distribuciones específicas, eliminando la necesidad de realizar dicha manipulación a mano (algo que a menudo se hace incorrectamente).

#include <random>

Cuestiones relacionadas