algorithm - tipos - ¿Hay un generador de números pseudoaleatorios lo suficientemente simple para hacer en tu cabeza?
que es un numero aleatorio en programacion (8)
¿Qué hay de Blum Blum Shub, pero con números primos demasiado pequeños para un uso seguro? Usado de manera segura es lento, pero involucra operaciones a las que estamos acostumbrados, por lo que puede alcanzar una velocidad manejable sin mucha práctica, tal vez con M = 437 o moderadamente más grande.
Dudo que cualquier cosa que pudiera hacer en mi cabeza sea segura, de todos modos. Simplemente no puedo recordar los números lo suficientemente grandes como para trabajar sin errores en un estado de tamaño razonable.
Puede hacer fácilmente un LFSR de 10 bits en sus dedos, si tiene tendones decentes ;-)
No es una respuesta directa, pero según el motivo de la pregunta, puede que te interese el Solitaire , que genera una secuencia de teclas (es decir, una secuencia pseudoaleatoria) utilizando un mazo de cartas. No se puede hacer en tu cabeza, pero no requiere lápiz ni papel.
¿Hay algunos generadores de números pseudoaleatorios que sean fáciles de hacer con la aritmética mental o la aritmética mental más el contar con los dedos? Obviamente, esto se limita a las matemáticas bastante simples: debe ser algo que alguien con capacidad matemática promedio pueda hacer, o tal vez capacidad promedio para un programador, no un prodigio matemático.
Lo más simple que he encontrado es el método del cuadrado medio , pero no solo se sabe que es una fuente pobre de aleatoriedad, sino que también parece demasiado complejo para hacerlo sin lápiz ni papel.
Si la única forma de hacerlo es limitando el rango, ya que tal vez solo pueda generar números de 8 bits, está bien. Sospecho que uno de los algoritmos PRNG estándar sería lo suficientemente simple en una versión de 8 bits, pero no sé lo suficiente como para simplificar ninguno de ellos desde la versión de 32 bits a la versión de 8 bits. (Todos los que miré dependen de números semilla seleccionados especialmente que son diferentes según la cantidad de bits con los que esté trabajando, y generalmente solo se dan ejemplos de 32 y 64 bits).
En tu cabeza puedes hacer generación de números aleatorios "semánticos" :-)
Al igual que tomar una palabra al azar y calcular alguna métrica a partir de ella, repita hasta que obtenga el número con una longitud razonable.
Por ejemplo, la palabra "ejercicio" se puede convertir a 10100101b (puede ver mi idea de conversión aquí).
Esto es bastante básico y debe caber en la cabeza de la mayoría de la gente:
- Comience con un número de semilla de tres dígitos (encontrar un semilla adecuada puede ser un problema más difícil).
- Multiplícalo por nueve.
- Separe el cuarto dígito de los tres inferiores y sume los dos números para obtener un nuevo número de tres dígitos.
- Anote estos dígitos. Para ayudar a disimular el patrón, puede escribir solo uno o dos de los dígitos.
- Repita 2-4 según sea necesario.
Mientras no empieces con cero, esto se repetirá en un período de 4500 resultados. La salida no se "ve" aleatoriamente, pero está en decimal e incluso los verdaderos resultados aleatorios no se ven aleatorios, por lo que los humanos apestan en esta tarea.
Podría intentar piratear un programa para convertirlo en binario de forma imparcial para probarlo.
Configuraciones alternativas:
- tres dígitos y multiplica por 3
- Cuatro dígitos y multiplica por 6.
- Cinco dígitos y multiplica por 2.
La forma más fácil sería generar varios números que lleguen a tu cabeza y luego sumar y modificar 10 cada uno de los dígitos. Cuantos más números agregues, más aleatorio y menos sesgado será.
510932
689275
539108
======
628205
Pseudoaleatorio ( según Dilbert ):
Sí, conozco uno que posiblemente se puede hacer en su cabeza, y si se modifica aún más puede resultar en números verdaderamente aleatorios, tome una lista de números, una lista ordenada de números en la base diez, que sería la más fácil de calcular. juntos, mantienen solo el número de posición de los dígitos de ese número resultante y luego lo colocan en el final de la lista y sueltan el primer dígito, y luego repiten, esto no producirá números aleatorios verdaderos sino lo suficientemente aleatorios y dependiendo de la el tamaño de la lista de números que elija utilizar se repetirá eventualmente, pero para una lista inicial grande no se repetirá durante un tiempo suficientemente grande.
por ejemplo, si usé solo 5 números en una lista 12345, la siguiente lista sería 2345 y el dígito más a la derecha de 1 + 2 + 3 + 4 + 5ie 15 o 5, por lo que la lista sería 23455. no se usa más, por lo que la siguiente suma suma 20 -1 (15 + 5 menos la que se dejó), por lo que la siguiente lista sería 34559, luego 45596, luego 55969 y 59694 ahora, aquí paramos, porque hemos generado un valor total de semillas de dígitos asi que inicialmente teniamos 12345.
Para la próxima semilla obtuvimos 59694, ahora hay una especie de atajo que también se puede usar una vez que se ha calculado una semilla completa, o se podría usar el atajo en sí mismo, que consiste en tomar el último dígito, multiplicarlo por 2 y restar el primer dígito duplicando un dígito se hace fácilmente en la cabeza, lo importante es recordar todos los otros dígitos y su orden en la secuencia, esto en el mejor de los casos, aunque solo producirá números pseudoaleatorios, con algunas repeticiones largas, mientras más grandes La lista de números que usa, pero la lista inicial debe elegirse con cuidado, como por ejemplo, no elija todos los ceros como lo hace o tendrá una corriente infinita de ceros y algunos conjuntos de dígitos producirán ciclos de repetición más largos que otros (pero tal vez esto debería hacerse en papel, siempre que tenga un lápiz o bolígrafo y una hoja de papel a mano ... :) Espero que esto ayude .. (modificado un poco, esto hace el inicio de un muy buen generador de números aleatorios ) disfrutar ...
Espero que esto sea mejor si no, entonces dímelo :) (¡Nunca fui muy bueno en inglés! :)
Si se permiten algoritmos no deterministas, tus ojos están en tu cabeza, entonces ¿Qué hay de algo así como "la cantidad de objetos rojos frente a mí más la cantidad de cosas azules, la cantidad de cosas verdes más la altura de la pila más alta de cosas?" que contiene al menos una cosa con las letras g y mayúscula A en ella ".
Estoy seguro de que hay una manera de hacer esto que sería bastante aleatorio.
Un registro de desplazamiento de retroalimentación lineal es bastante simple, siempre y cuando te sientas cómodo pensando en binario (o tal vez en hexadecimal, ya que es fácil de asignar entre los dos).
Una más compleja es Xorshift , pero si conoce sus operaciones bitwise, también debería ser posible trabajar con él.