2009-05-04 7 views
5

He usado¿Cuál es la función más aleatoria en C++?

#include<stdlib> 
#include<time> 
using namespace std; 
srand((unsigned)time(0)); 
int n=(rand()>>8)%4; 

pero lo demás funciones aleatorias están allí, o qué otras funciones podrían ser utilizados como generadores de números aleatorios?

EDIT: Realmente no tengo un motivo en particular para hacer esta pregunta, solo quería saber si C++ tenía alguna otra función aleatoria.

+4

Por favor, aclare la pregunta; ¿te refieres a una distribución criptográficamente segura (difícil de predecir) o simplemente buena? – Zifre

Respuesta

14

El rand() y srand() son todos especifica el estándar de C++. Y si se trata de escribir su propia, estar al tanto de lo que John von Neumann dijo:

"Cualquier persona que considera aritméticas métodos de producción de dígitos aleatorios es por supuesto, en un estado de pecado"

-4

El tiempo suele ser la operación más aleatoria que también es barata de realizar, pero aún es posible predecir.

Si desea aleatoriedad real, la única solución es utilizar algún tipo de entrada externa.

Quantum Random Bit Generator es un servicio que proporciona dichos datos.

+2

El tiempo no es tan aleatorio. Escribí un software de apuestas en línea una vez y no nos permitieron usar un generador aleatorio basado en el tiempo para decidir qué cartas tratar. Resulta que es bastante fácil adivinar a qué hora se está ejecutando el servidor en función de la mano que se le reparte. – rein

+0

cierto. Eliminaré esa línea. –

5

No es estrictamente C++, pero Windows específica:

CryptGenRandom

estoy seguro que todos los sistemas operativos tienen sus equivalentes funciones criptográficamente seguros generador aleatorio.

-2

Random te da un buen número al azar en la distribución uniforme y hace un muy buen trabajo en eso.

Cualquier otra cosa significaría que realmente desea sesgar la distribución.

Por ejemplo, usar el generador de GUIDs de Microsoft le daría una identificación aleatoria que es menos probable que se repita y tiene en cuenta cosas como el tiempo y la computadora.

+1

Los GUID no son aleatorios –

+0

Creo que está buscando funciones criptográficamente seguras, no solo distribución equitativa. Las preguntas no son muy claras sin embargo. – Zifre

+0

@Uri Amd ¿A qué se refiere este "Aleatorio" en "Aleatorio te da ..."? –

16
  • Boost Random Number Library ofrece una amplia gama de generadores (calidad frente a rendimiento) y algunas distribuciones aleatorias típicas. Todo bastante agradable y sencillo de usar.
  • Si quiere algunos otros métodos/bibliotecas, entonces google para números aleatorios criptográficos, también puede usar this document como referencia.
  • No invente sus propias soluciones a menos que sea un experto/investigador en el campo/etc., aproveche las soluciones ya existentes que generalmente fueron escritas por Smart People, y examinadas minuciosamente por otras personas inteligentes. funciones
2
int unixrand() 
{ 
    int x; 
    int f = open("/dev/random", O_RDONLY); 
    if (f < 0) return -1; /* Error */ 
    if (sizeof(x) != read(f, &x, sizeof(x))) { 
     close(f); 
     return -1; 
    } 
    close(f);  
    if (x < 0) x = ~x; 
    return x; 
} 
+0

¿Por qué la comprobación de x <0? Además,/dev/urandom sería una mejor opción, a menos que desee realmente datos aleatorios (para criptografía, etc.)./dev/random es un recurso demasiado valioso :) – Paggas

+1

Estoy haciendo una función que devuelve cualquier x aleatorio positivo como la función de biblioteca estándar de C. Sí,/dev/urandom es mejor para la mayoría de los casos. – Joshua

1

(publicación cruzada de answer I just wrote a una pregunta similar)

Eche un vistazo a ISAAC (Indirection, Shift, Acumulate, Add y Count). Está distribuido uniformemente y tiene una longitud de ciclo promedio de 2^8295.

También es rápido, ya que no implica la multiplicación o el módulo.

0

Bruce Schneier y John Kelsey escribieron a random number generator que usted puede estar interesado. En cambio, es un generador de semillas. A pesar de que Yarrow ya no es compatible, es posible que le interese cómo genera entropía.

OpenSSL has an API que es relativamente fácil de acceder y bastante portátil. Y Mozilla viene con a decent API that wraps whatever the OS offers.

Personalmente, sin embargo, generalmente utilizo Boost.Random, que ya se sugirió.

14

Este código es bastante eficiente. Aunque los usuarios pueden comenzar a notar un patrón después de algunas iteraciones.

int FastRandom() 
{ 
    return 10; 
} 
+3

¡¡¡LOL !! ¡bueno! – fengshaun

+1

Acabas de copiar el número 221 :) http://xkcd.com/221/ –

+0

No era consciente, pero sí, ¡buena caricatura y probablemente lo vi! – justinhj

Cuestiones relacionadas