Sin el uso de un generador de números aleatorios, ¿cuál es el método más complicado que se te ocurre para generar una serie de números enteros?

Salvo equipo especializado que realmente puede muestrear un proceso aleatorio (por ejemplo, descomposición de partículas), que es lo que creo que quiere decir cuando dice “sin el uso de un generador de números aleatorios”, lo que está buscando es un generador de números pseudoaleatorios ( PRNG).

¿Por qué un algoritmo PRNG y no otro tipo de algoritmo de generación de secuencia? Porque está pidiendo algo que haga que las relaciones entre los números en la secuencia sean extremadamente difíciles de determinar. En otras palabras, debería verse lo más aleatorio posible sin ser realmente aleatorio, que es precisamente el objetivo de un PRNG.

Hay muchos algoritmos PRNG, pero el más utilizado es el Mersenne Twister.

Los buenos PRNG están diseñados para que, en la medida de lo posible sin una fuente de entropía verdadera, las secuencias que generan exhiban todas las características estadísticas de una secuencia de números verdaderamente aleatoria. Sin embargo, no importa cuán perfecto sea el PRNG, sin una verdadera fuente de entropía, su secuencia generada comenzará a repetirse en algún punto (aunque el período, es decir, la longitud de la secuencia antes de que el algoritmo comience a repetirse) puede ser arbitrariamente largo dependiendo del algoritmo usado).

Para garantizar que un PRNG no genere la misma secuencia de números aparentemente aleatorios cada vez que se usa, están diseñados para usar un valor o vector (es decir, un conjunto específico de múltiples valores diferentes) llamado “semilla”. El uso de una semilla diferente, para un PRNG correctamente diseñado, garantizará que se genere una secuencia muy diferente de números aparentemente aleatorios. Un enfoque común y simplista aquí es usar de alguna manera la fecha / hora actual hasta el milisegundo como valor inicial, de modo que obtenga secuencias totalmente diferentes de números aleatorios de manera efectiva cada vez que use el PRNG.

Además, si el PRNG se usará en métodos criptográficos o de simulación de Monte-Carlo, debería ser extremadamente difícil predecir la secuencia de números que se generará sin conocer el valor semilla / vector. Por lo tanto, debería, por extensión, ser extremadamente difícil derivar los valores semilla simplemente conociendo una secuencia de números generados por el PRNG incluso cuando conozca el algoritmo .

Una respuesta concreta a su pregunta, entonces: a menos que sus conocidos sean criptógrafos o estén familiarizados con las herramientas y técnicas de criptoanálisis, el algoritmo Mersenne Twister debería ser más que adecuado.

Si las personas a las que intenta engañar son criptoanalistas, entonces use un PRNG criptográficamente seguro.

Use una combinación de Exponenciación Modular y límites de rango para producir una secuencia aleatoria aparente. La solución en el límite requiere Logaritmos discretos para los que actualmente no existe un algoritmo conocido. Asegúrese de que los números primos involucrados tengan propiedades que dificulten la búsqueda del registro discreto.

Advertencia: ningún algoritmo generará números aleatorios. En el mejor de los casos, generará números pseudoaleatorios. La semilla para esto es tu elección.

  1. Seleccione un valor entero R para su límite superior de un rango [0..R).
  2. Seleccione dos números primos grandes, P y Q, de modo que P mod (Q-1) / 2! = 1 y P ^ 2> Q y Q> = R.
  3. Calcular R ‘= Q – (Q mod R).
  4. Mantener una J global inicializada con una semilla entera.
  5. temp = P ^ (J ++) mod Q. Si temp> R ‘, vaya al paso 5.
  6. Regresar temp mod R.

Esto utiliza la exponenciación modular para calcular un flujo de números aparentemente aleatorio y no repetitivo. El paso 2 asegura que los números primos seleccionados se comporten bien y recorran todo el rango de números (Z +, creo). Debería generar números pseudoaleatorios razonables, aunque lo más probable es que no pasen pruebas estadísticas de aleatoriedad. Esta no es una forma segura de generar números aleatorios. Los valores devueltos aparecerán al azar para los seres humanos y si P y Q se mantienen en secreto será difícil de predecir. Nuevamente, esto no debe usarse para aplicaciones seguras.

Para resolver este problema se requiere el uso de logaritmos discretos. El grado de dificultad para resolver esto dependerá de los tamaños de R, Q y P. R puede ser igual a Q para simplificar un poco el problema.

Primero voy a suponer que por “generador de números aleatorios” te refieres a “fuente de entropía” que puede crear “aleatoriedad verdadera”, como un diodo de ruido o / dev / random, en lugar de un “generador de números pseudoaleatorios”.

Por lo tanto, desea un algoritmo enrevesado para proporcionar una secuencia entera donde sea imposible para alguien adivinar el siguiente valor.

Bueno, lo siento, soy un programador: no soy complicado, especialmente cuando se trata de aleatoriedad. Hay buenas razones para esto.

Si está tratando de hacer una secuencia segura y no aleatoria, y obtiene un algoritmo enormemente complicado para generar la secuencia aleatoria, entonces es muy difícil demostrar que no existe un algoritmo más simple que logre lo mismo. También es muy difícil asegurarse de que sus números aleatorios sean verdaderamente aleatorios y no tengan un sesgo.

Entonces, por seguridad, usaría un algoritmo generador de números pseudoaleatorios criptográficamente seguro.

==

A continuación, supondré que solo quieres un algoritmo que la gente * pueda * adivinar, pero sería complicado.

Qué tal (a través del Listado de secuencias enteras esotéricas de PrimeFan): 1, 3, 40, 41, 59, 66, 94, 102, 146, 150, 151, 160, 161, 164, 165, 167, 215, 232, 233, 236, 237, 239, 255, 330, 332, 333, 334, 354, 356, 357, 359, 363, 364, 365, 367, 394, 402, 404, 405, 406, 408, 409, 414, 415, 420, 421, 423, 424, 425, 426, 428, 429, 538, 542, 608, 609, 636, 637, 638, 782, 786, 794, 796, 797, 799, 812, 813, 815, 824, 825, 826, 850, 851, 854, 870, 878, 884, 885, 887, 890, 894, 896, 897, 899, 904, 905, 907, 911, 914, 916, 917, 920, 921,…

Números donde el valor de la función de Möbius y la función de Mertens son iguales.

Es trivial elegir otros: “números primos donde si los multiplica por 23 y resta 17, al menos un dígito impar aparece exactamente una vez” da: 2,3,5,7,11,17,23,29,31,37, 41,43,47,53,59,61,67,73,79,83,89,97,…

Instala una cámara en una calle concurrida. Capture imágenes de placas y use OCR para resolver las imágenes a números.

Por supuesto, sus enteros no estarían en orden numérico, y tendría repetición. La tasa de recolección también variará según la hora del día.

No es realmente aleatorio, ya que alguien podría predecir el próximo número al observar el tráfico antes de que sea capturado por la cámara, y alguien podría envenenar la aleatoriedad al pasar una línea de autos por la cámara con números de placa conocidos y específicamente ordenados, pero a largo plazo El análisis es efectivamente aleatorio.

Podría mejorar la aleatoriedad implementando una red de varias de esas cámaras.

Aquí no hay un “generador de números aleatorios”, aunque supongo que se podría argumentar que se trata de un generador de números aleatorios, ya que la serie no sería reproducible. ¿Es lo suficientemente complicado para usted?

Los números aleatorios no son realmente aleatorios, sino que se generan con algoritmos que garantizan los mismos números para una semilla establecida. Entonces, usar el algoritmo generador de números “aleatorios” de cualquier idioma para obtener su serie de enteros es en realidad uno de los métodos más complicados que puede encontrar.

1, 2, 6, 39, 528, 8824, 63505, 893850,?

Puede que este no sea demasiado difícil, aunque no estoy seguro … Algoritmo está en los comentarios

More Interesting

¿Cuál es la altura, el tamaño y la profundidad de un árbol binario?

Cómo ganar un producto CodeChef o Codeforces (pegatinas especiales)

Cómo resolver problemas máximos de subarreglos de productos

¿Obtendría algún beneficio resolviendo los problemas del Proyecto Euler por la fuerza bruta?

¿Cuál sería un buen método o algoritmo para predecir el ganador de una carrera de caballos, dada una gran cantidad de información sobre las carreras de caballos?

En las estructuras de datos, ¿cuál puede ser un ejemplo general utilizado para explicar el peor de los casos, los tiempos de ejecución amortizados y esperados?

Algoritmos: ¿Cómo encuentro un elemento en una secuencia que sea más pequeño que mi número en la secuencia, a la izquierda de mi número y a la derecha de todos esos elementos?

¿Cuáles son los problemas actuales que enfrentan los algoritmos de identificación automática de números de clúster?

¿Cómo es inventar tu propio algoritmo?

¿Qué significa Yoshua Bengio que la principal limitación de los algoritmos de aprendizaje automático actuales es que necesitan demasiados datos para aprender?

¿Qué es la recurrencia en análisis de diseño y algoritmos?

¿Cuál es la diferencia entre recursividad e iteración?

¿Para qué se usan realmente los algoritmos?

¿Por qué los conjuntos en Python tienen una complejidad algorítmica de O (1)?

¿Cómo pueden uno y qué algoritmos podrían usarse para entrenar una red neuronal profunda con una cantidad limitada de datos desaprender sus representaciones mal aprendidas?