2010-10-12 15 views
20

¿Hay generadores de números pseudoaleatorios que sean lo suficientemente fáciles de hacer con la aritmética mental o la aritmética mental, además de contar con los dedos? Obviamente, esto limita a la matemática bastante simple: tiene que ser algo que alguien con una capacidad matemática promedio pueda hacer, o tal vez una habilidad promedio para un programador, no un prodigio matemático.¿Hay un generador de números pseudoaleatorio lo suficientemente simple como para hacer en tu cabeza?

Lo más simple que he encontrado es Middle square method, pero no solo se sabe que es una fuente de aleatoriedad deficiente, todavía parece demasiado complejo sin lápiz ni papel.

Si la única manera de hacerlo es limitando el rango, tal vez solo puede dar como resultado números de 8 bits, eso está bien. Sospecho que uno de los algoritmos estándar de PRNG sería lo suficientemente simple en una versión de 8 bits, pero no sé lo suficiente como para simplificar cualquiera de ellos, desde la versión de 32 bits a la versión de 8 bits. (Todos los que miré dependen de números de semilla especialmente seleccionados que dependen de la cantidad de bits con los que trabajas, y generalmente solo se dan ejemplos de 32 y 64 bits).

+14

Paso 1. Piensa en el primer número que aparece en tu cabeza. ;-) –

+4

@Mike Deck: lo hice, y obtuve 6275182149295802584461. Necesito dormir un poco. – BoltClock

+4

Pensando en el primer número que aparece en su cabeza tiene una función de distribución deficiente. Por ejemplo, 7 y 17 son mucho más comunes que otros números. http://scienceblogs.com/cognitivedaily/2007/02/is_17_the_most_random_number.php – LeBleu

Respuesta

14

A linear feedback shift register es bastante simple, siempre y cuando te sientas cómodo con pensar en binario (o tal vez en hexadecimal, ya que es fácil mapear entre los dos).

Una más compleja es Xorshift, pero si conoce sus operaciones bit a bit, también debería ser posible trabajar con ella.

2

En tu cabeza puedes hacer "semántica" generación de números aleatorios :-)

Como tomar la palabra al azar, y calcular alguna métrica, repita hasta que obtenga el número con una longitud razonable.

Por ejemplo, la palabra "ejercicio" podría convertirse a 10100101b (aquí puede ver mi idea de conversión).

35

pseudo-aleatorio (according to Dilbert):

Dilbert Cartoon of 2001-10-25

+3

¿Entonces dices "pensar en 9"? –

+4

No, hagas lo que hagas, no pienses en 9. – Hans

+2

Consideré vincular preventivamente ese y el cómic xkcd en mi pregunta ... supongo que debería tener – LeBleu

3

¿Qué hay de Blum Blum Shub, pero con los números primos son demasiado pequeñas para el uso seguro? Usado con seguridad es lento, pero involucra operaciones que estamos acostumbrados a enfrentar, por lo que es posible que pueda alcanzar una velocidad manejable sin demasiada práctica, tal vez con M = 437 o moderadamente más grande.

Dudo que cualquier cosa que pueda hacer en mi cabeza sea segura, de todos modos. Simplemente no puedo recordar números lo suficientemente grandes para trabajar sin errores en un estado de tamaño razonable.

Usted puede hacer fácilmente un LFSR de 10 bits en los dedos, si usted tiene tendones decente ;-)

No es una respuesta directa, pero dependiendo de qué estás preguntando que podría estar interesado en Solitaire, que genera una Keystream (es decir, una secuencia pseudoaleatoria) usando una baraja de cartas. No se puede hacer en tu cabeza, pero no requiere lápiz y papel.

+0

No creo que Blum Blum Shub sea lo suficientemente aleatorio con divisores pequeños ... M = 437 da un período de 31 o menos. Además, los primeros números son siempre cuadrados de la semilla a menos que use una semilla grande. – LeBleu

+0

@LeBleu: es suficiente, obviamente no sé cuántos números necesitas. Como digo, no creo que personalmente sea lo suficientemente bueno en aritmética mental para evaluar un buen PRNG, por lo que necesita ser mejor que yo, o decidir qué tan malo es un RNG que está dispuesto a aceptar ;-) –

0

Sí, sé de uno que posiblemente se puede hacer en su cabeza, y si se modifica más puede dar como resultado números aleatorios, tome una lista de números, una lista ordenada de números en base diez porque sería la más fácil de calcular en.Agréguelos juntos, mantenga solo el número de dígito del número resultante y luego colóquelo al final de la lista y deje el primer dígito, y luego repita, esto no producirá verdaderos números aleatorios, sino lo suficientemente aleatorio y dependiendo En el tamaño de la lista de números que elija utilizar, con el tiempo se repetirá, pero para una lista inicial grande no se repetirá durante un período de tiempo suficientemente grande.

por ejemplo si solo utilicé 5 números en una lista 12345, entonces la siguiente lista sería 2345 y la más derecha de 1 + 2 + 3 + 4 + 5ie 15 o 5, entonces la lista sería 23455 ahora la tiene caído y no se usa más, así que la siguiente suma suma 20 -1 (15 + 5 menos la que dejó) así que la siguiente lista sería 34559, luego 45596, luego 55969, luego 59694 ahora aquí paramos, porque hemos generado un total de semillas digno de dígitos así que inicialmente teníamos 12345.

Para la próxima semilla tenemos 59694, ahora hay una especie de atajo que también puede usar una vez que se ha calculado una semilla completa, o el atajo mismo podría ser usado, que es tomar el último dígito, multiplicarlo por 2 y restar el primer dígito doblar un dígito se hace fácilmente en la cabeza, el importante Lo importante es recordar todos los otros dígitos y su orden en la secuencia, esto en el mejor de los casos solo producirá números pseudoaleatorios, con algunos tiempos de repetición largos cuanto mayor sea la lista de números que use, pero la lista inicial debe elegirse con cuidado, como por ejemplo, no escoja todos los ceros a medida que enumera o tendrá un flujo interminable de ceros y bien 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 lápiz y una hoja de papel a mano ... :) espero que esto ayude ... (modificado un poco esto hace que el comienzo de un muy buen generador de números aleatorios) disfrute ...

Espero que esto sea mejor si no entonces dime que sí :) (¡Nunca fui muy bueno en inglés! :)

+2

por favor, eche un vistazo a la [ayuda de formateo] (http://stackoverflow.com/editing-help). Esto es solo una gran pared de texto :) – oers

+0

oh la ayuda de formateo no lo vi, ¿dónde está? perdón por ese muro de texto, no importa cómo está formateado, lo que importa es la información dentro ... Supongo que estaba tan preocupado con los errores ortográficos. Olvidé formatear esto de una manera más legible, lo siento. –

+0

Es el cuadro amarillo con el? en eso. Por encima del campo de respuesta. Pero por favor formatee su texto. Es muy difícil de leer y eso hace que sea casi imposible comprender la información que contiene. La forma en que una respuesta se ve influye mucho en su aceptación por parte de la comunidad. – oers

-2

La manera más fácil sería generar varios números que se le ocurran y luego sumar y modificar 10 de cada uno de los dígitos. Cuantos más números agregue, más aleatorio y menos sesgado será.

510932 
689275 
539108 
====== 
628205 
+0

Buen punto, sin embargo está sesgado porque va a generar una función monotónica, como A + B> = A. – Lourenco

2

Esto es bastante básico y debe caber en la mayoría de las cabezas de la gente:

  1. comenzar con un número de semillas de tres dígitos (encontrar una semilla adecuada puede ser un problema más difícil).
  2. Multiplíquelo por nueve.
  3. Separe el cuarto dígito de la parte inferior tres y agregue los dos números juntos para un nuevo número de tres dígitos.
  4. Anote estos dígitos. Para ayudar a disfrazar el patrón, puede escribir solo uno o dos de los dígitos.
  5. Repita 2-4 según sea necesario.

Siempre y cuando no comience con cero, esto se repetirá durante un período de 4500 resultados. La salida no se "ve" al azar, pero está en resultados decimales e incluso aleatorios verdaderos no se ven al azar, por lo que los humanos apestan en esta tarea.

Podría intentar hackear un programa para convertirlo en binario de forma imparcial para probarlo.

configuraciones alternativos:

  • tres dígitos y se multiplican por 3
  • cuatro dígitos y se multiplican por 6
  • cinco dígitos y se multiplican por 2
-1

Si se permite que los algoritmos no deterministas, sus ojos están en su cabeza, entonces ¿qué pasa con algo así como "la cantidad de objetos rojos frente a mí más el número de cosas azules? módulo la cantidad de cosas verdes más la altura del la pila más alta de cosas que contiene al menos una cosa con las letras gy mayúscula A ".

Estoy seguro de que hay una manera de hacer esto que en realidad sería bastante aleatoria.

+0

No tengo problemas con algoritmos no deterministas, pero desafortunadamente también hay muchas maneras de hacerlo que serían bastante predecibles, tales como altamente dependiente de las frecuencias de letras en su lengua materna. El ejemplo específico que proporcionó también solo daría un número aleatorio para una vista determinada, y si dos personas cercanas la usaran, probablemente obtendrían el mismo número. – LeBleu

+0

No pensé en eso. Tal vez agregue su nombre y su edad? El problema del número de vista de un número sigue siendo bastante importante. – EternityForest

Cuestiones relacionadas