¿Cómo se asegura que lo que uno hace produce algo aleatorio y pueden los resultados ser probados de alguna manera?

El Diario de ACM, Transacciones sobre Matemáticas , tiene un largo historial de generadores y conjuntos de números aleatorios publicados para verificar su aleatoriedad. Si quieres que sea verdaderamente aleatorio, eso es una cosa. Si necesita evitar cualquier patrón en los números, eso es otra cosa. Y si quiere repetibilidad junto con esas necesidades, eso lo hace un poco más complicado.

El mejor generador de números aleatorios, como se señala ampliamente, es un dispositivo periférico que realiza un seguimiento de la descomposición de un material radiactivo. En serio. A falta de eso, solo podemos intentar simular la aleatoriedad.

Semilla: para el aspecto verdaderamente aleatorio, necesitará supervisar los accesos al disco, los retrasos del teclado y las marcas de tiempo en las lecturas de la red, así como usar los nanos del reloj en tiempo real, para que pueda generar una “semilla” aleatoria ”

Acumulador: para minimizar los patrones, deseará conectar en cascada múltiples generadores de números pseudoaleatorios, cada uno utilizando un módulo de número primo de un “acumulador” que se incrementa con un coeficiente principal. La web está llena de ejemplos de cómo hacer esto.

Normalmente puede resembrar el acumulador agregando una nueva semilla en cada acceso o cada tantos accesos. Pero si desea repetibilidad, solo siembre una vez cuando comience, luego realice un seguimiento de esa semilla para volver a usarla cuando quiera repetirla.

Al tratar con un generador de números aleatorios, debes tener cuidado de no vencerlo. Nunca piense que puede obtener un número aleatorio mayor multiplicando dos números aleatorios. Si necesita un número aleatorio mayor, diseñe un nuevo generador de números aleatorios que use una semilla más grande, un acumulador más grande y primos más grandes.

Hay muchas más advertencias, pero creo que esto es suficiente para comenzar.

Buena suerte,

Un programador no debe crear un código central para producir un resultado aleatorio. La mejor manera es investigar y confiar en métodos probados que están disponibles en todos los idiomas serios. Encontrará una variedad de métodos, basados ​​en intercambios entre el tiempo de cálculo y el nivel de seguridad, y si lo que se codifica debe decodificarse más tarde.

Por ejemplo, las contraseñas nunca deben decodificarse intencionalmente en un programa legítimo. Deben codificarse de forma que dificulten lo más posible los intentos ilegítimos de decodificarlos (en términos de tiempo y requisitos de cálculo), incluso cuando el hacker sepa cómo se codificaron.

Por otro lado, los mensajes encriptados son inútiles a menos que el destinatario pueda revertir el proceso de encriptación. Hay muchas formas comprobadas de lidiar con ese dilema, algunas más seguras que otras.

El idioma Go de Google es de código abierto y tiene una sólida biblioteca de paquetes de criptografía. Las mejores soluciones a menudo combinan dos o más de los enfoques enumerados en el siguiente enlace. Go es un lenguaje bastante legible para cualquiera que haya utilizado un lenguaje derivado de C. Alternativamente, las búsquedas web simples deberían encontrar implementaciones de la mayoría de los métodos en otros idiomas. crypto – GoDoc

A2A. Como señaló Raúl Castro, existen pruebas estadísticas de aleatoriedad. Para asegurarte de que tienes una forma de “producir algo aleatorio”, necesitas un conocimiento de criptografía. Si las claves de código no son casi completamente aleatorias, se pueden romper fácilmente. También hay algo llamado “semillas” o “sal” que ayuda a maximizar la entropía. Sé que la mayoría de los esquemas de encriptación “caseros” son triviales para decodificar. Lo siento, no soy un criptólogo. Usted necesita uno.

– Un breve vistazo a Wikipedia (Google sigue siendo mi mejor amigo) te da un buen comienzo: pruebas de aleatoriedad. Todo se basa en la aleatoriedad estadística.
Profundizar en la bibliografía lo ayudará a obtener respuestas bien fundamentadas.

– Las estadísticas de aprendizaje en la universidad lo acercan al tema: prueba de aleatoriedad

– Los conjuntos de datos aleatorios son un problema que los programadores tienen que enfrentar de vez en cuando: ¿cómo debo probar la aleatoriedad?

¡Que te diviertas!