usar repetir rango numeros numero generar entre digitos decimales como clase arreglo aleatorios aleatorio c# performance random

repetir - La implementación más rápida de un verdadero generador de números aleatorios en C#



generar numeros aleatorios en un arreglo en c++ (8)

La única forma conocida de obtener números verdaderamente aleatorios en hardware es lenta; Si tratas de acelerarlo, tu pelo se pondrá blanco, se caerá en grupos y el NRC envía robots para limpiar tu sala de servidores.

Estoy con Mehrdad en este caso: no intentes rodar el tuyo.

Estaba leyendo acerca de Random.Next () que para "número aleatorio criptográficamente seguro adecuado para crear una contraseña aleatoria" MSDN sugiere RNGCryptoServiceProvider Class

¿Qué es la penalidad de velocidad? ¿Hay alguna forma más rápida de obtener verdaderos números aleatorios?

EDITAR: con Random.Next () obtengo un nuevo número aleatorio. Y con...

byte[] randomNumber = new byte[1]; RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider(); Gen.GetBytes(randomNumber); int rand = Convert.ToInt32(randomNumber[0]);

Obtengo un "número aleatorio criptográficamente seguro". Quiero saber si el código anterior es rápido en comparación con "Random.Next ()" y si hay alguna forma rápida de obtener los mismos resultados, ¿está bien?


¡El "número aleatorio criptográficamente seguro" generado por su código de ejemplo solo estará entre 0 y 255 inclusive!

Si desea devolver todos los valores Int32 posibles, debe usar 4 bytes aleatorios. Tu código debería verse más o menos así:

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] rndBytes = new byte[4]; rng.GetBytes(rndBytes); int rand = BitConverter.ToInt32(rndBytes, 0);

Un punto de referencia rápido en mi máquina (vieja) sugiere que Random.Next es aproximadamente Random.Next más rápido que usar RNGCryptoServiceProvider .


AFAIK nunca se implementará un verdadero generador aleatorio en C #. ¿Eso solo se puede hacer con la ayuda del hardware?


La forma más sencilla de responder a su pregunta podría ser volteando su pregunta al revés.

Supongamos que la implementación de CryptoServiceProvider tiene todas las ventajas. Es igual de rápido y usa tan poca memoria como Random. Next.

Entonces, ¿por qué existen ambas implementaciones ? ¿Por qué incluso tenemos Random.Next en el marco?

Mira lo que sabemos sobre cada implementación. Uno genera un número aleatorio criptográficamente seguro, el otro no hace promesas.

¿Cuál es más simple? ¿Generar números aleatorios que sean suficientemente aleatorios para ser utilizados en la criptografía, o generar números que simplemente "parecen" aleatorios, pero no garantizan nada más? Si no hubiera un costo asociado con la generación de números aleatorios criptográficamente seguros, entonces cada generador de números aleatorios lo haría.

Por lo general, puede suponer que las funciones de biblioteca estándar están diseñadas para hacer lo que dice la caja y hacerlo bien. Random.Next está diseñado para obtener el próximo número aleatorio en una secuencia de números pseudoaleatorios de la manera más eficiente posible .

CryptoServiceProvider está diseñado para generar números aleatorios lo suficientemente fuertes como para ser utilizados en criptografía, y hacerlo de la manera más eficiente posible. Si había una manera de hacer esto tan eficientemente como Random.Next, entonces Random.Next lo usaría también .

Su pregunta parece suponer un daño cerebral por parte de los diseñadores del marco: que de alguna manera diseñaron una función innecesariamente lenta para generar números aleatorios criptográficamente seguros, aunque había una manera más rápida.

La forma más rápida de generar números aleatorios criptográficamente seguros es más probable que llame a la función diseñada por expertos para generar números aleatorios criptográficamente seguros.


La regla de oro cuando se trata de seguridad y criptografía:

Nunca escribas el tuyo

Vaya con la forma estándar de hacerlo y evite optimizaciones peligrosas.

Editar para abordar la pregunta actualizada:

Use Random.Next cuando necesite números estadísticamente aleatorios que no se usan en el código sensible a la seguridad y RNGCryptoServiceProvider en código sensible a la seguridad. No es tan rápido como Random.Next pero tiene un rendimiento aceptable. Debe comparar para ver la diferencia real. Por lo general, no tiene sentido sacrificar la seguridad por el rendimiento.


Lo que debes hacer antes que nada es aprender las diferencias básicas entre un RNG , un PRNG y un CSPRNG .

Solo después de esto deberías decidir qué es lo que realmente necesitas y qué posibles implementaciones podrían ser. Como regla general, sin embargo, debe aceptar lo que se ha establecido y se ha demostrado que es una implementación adecuada.


Un problema secundario, pero interesante, es su uso de "verdadero" en la pregunta. Los verdaderos números aleatorios no existen en hardware o software. Existen en la "vida real" como en la descomposición radiactiva o el ruido en una línea, pero no pueden ser generados por un programa. Por lo tanto, tenga en cuenta el uso de jalf de "pseudo-" y compruebe los enlaces de jcinacio a wikipedia.


Otro punto que no se ha mencionado:

PRNG producirá resultados predecibles dado el mismo valor inicial de semilla. CSPRNG no lo hará; no tiene valor inicial. Esto hace que los PRNG (hasta cierto punto) sean adecuados para su uso en algoritmos de flujo de cifrado. Dos computadoras con los mismos vectores de inicialización (utilizados como valores semilla para uno o más PRNG) podrían comunicarse de manera efectiva entre sí en privado utilizando el resultado XORed de los bytes de texto sin formato y el resultado de los PNG sin clasificar utilizados.

No pretendo que una implementación así sea necesariamente criptográficamente segura, por supuesto; solo que tal implementación requeriría la previsibilidad de un PRNG que CSPRNG no ofrece.