Su tarea es improvisar un generador de números aleatorios de hardware con cualquier hardware que tenga por ahí.
Desafío
Escriba un programa con las siguientes propiedades:
- Imprime ya sea
0
o1
(y nada más). - La salida depende de un proceso físico y no solo del estado interno de la computadora.
- No hay relación entre las salidas de ejecuciones posteriores (con un minuto de diferencia).
- El resultado no es predecible con ningún esfuerzo realista.
- La probabilidad de que la salida
0
sea entre 0.2 y 0.8. - Se ejecuta en menos de un minuto con una probabilidad razonablemente alta.
Debe explicar por qué su programa tiene estas propiedades, si no es obvio.
Aclaraciones y restricciones
Lo siguiente puede parecer una gran cantidad de restricciones para un concurso de popularidad, pero en última instancia, todo es para garantizar que el programa se mantenga dentro del espíritu de la pregunta, de alguna manera funcione y para evitar soluciones que son populares debido a una exageración total pero que son en última instancia bastante aburrido
- El tiempo del sistema no cuenta como un proceso físico.
- Puede usar cualquier hardware de calidad de consumidor que desee, desde unidades de disco floopy de 8 pulgadas hasta un lanzador de cohetes USB y auriculares, a menos que esté destinado a la generación de números aleatorios. Una pieza de hardware es de calidad para el consumidor, si se produce en masa y cuesta menos de 1000 $ / € / £, por lo que no puede usar radiotelescopios, el CERN, MRI o su detector de partículas casero.
- Solo puede hacer las suposiciones más básicas sobre el estado y la alineación del hardware, como estar encendido (si tiene un interruptor de alimentación) y estar instalado y funcionando correctamente. Por ejemplo, puede suponer que una unidad de CD es generalmente capaz de leer un disco y no estar atascada, pero no puede suponer que esté abierta o cerrada o que contenga un disco. En otro ejemplo, no puede suponer que dos piezas de hardware estén alineadas para permitir una interacción especial, pero puede suponer que están en la misma habitación.
- Puede dejar el hardware en el estado que desee, a menos que lo rompa.
- Puede y debe asumir que el hardware está en un entorno natural, pero nada más. Por ejemplo, puede suponer que el hardware no está colocado en un tanque de helio líquido ni en una habitación extremadamente insonorizada ni a prueba de luz ni en el espacio. Sin embargo, no puede suponer que haya fuentes de sonido y luz, excepto aquellas que solo pueden evitarse con esfuerzos radicales.
- Su programa debe ejecutarse en una computadora de escritorio estándar con un sistema operativo no esotérico de su elección. Puede emplear cualquier software que no esté específicamente diseñado para la generación de números aleatorios.
- No puede asumir el acceso a Internet.
- No puede suponer que los humanos estén presentes o ausentes, pero puede suponer que nadie interfiere intencionalmente con su programa, por ejemplo, deteniendo manualmente un ventilador o ejecutando un programa que no hace nada más que apagar el micrófono con la mayor frecuencia posible.
- Solo puede hacer las suposiciones más básicas sobre la configuración del software. Por ejemplo, puede asumir que los controladores están instalados y activados, pero debe estar preparado para silenciar el sonido.
- Puede dejar la configuración del software en el estado que desee.
Prima
Se otorgó una recompensa especial a una solución particularmente corta. Esto fue más bien por números de instrucciones y similares que por caracteres. Los ganadores fueron (empatados según mi criterio):
- Esta respuesta de Franki.
- Esta respuesta de Tejas Kale.
Solo pude otorgar una respuesta y la respuesta de Tejas Kale ganó por sorteo.
fuente
Respuestas:
Cáscara
Lee una sola muestra del flujo del micrófono e imprime su bit menos significativo, que debe estar dominado por el ruido.
EDITAR: Cambiado para activar el micrófono ... ¡y todo lo demás también!
fuente
cat /dev/urandom > /dev/dsp
, en caso de que la computadora esté en una habitación / cámara / caja / caja / espacio insonorizadas.Golpetazo
Reúne la entropía del tiempo de respuesta de un solo ping a localhost.
Tenga en cuenta que el tiempo de respuesta aparece exactamente tres veces en la salida de
ping -qc1
:Todos los demás números y constante y, lo que es más importante, independiente del tiempo de respuesta.
sed 's/[^1-9]/+/g'
convierte cada cero y no dígito en signos más, eecho $[...0&1]
imprime la paridad de la suma resultante.fuente
CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin
-ping
no tiene ninguno-q
o-c
aquí.ping
confirmado. Estoy sorprendido.JavaScript + HTML5 DeviceMotion
JS Violín aquí .
Utiliza la API HTML5 DeviceMotion en dispositivos compatibles (en su mayoría dispositivos móviles). Convierte el
acceleration
objeto resultante en JSON, lo procesa y toma el resto del módulo 2.La mayor parte del código es la función hash (maldito sea JavaScript, y su total falta de una biblioteca estándar). Probablemente podría ser más corto, pero soy un fanático de una buena función hash.
fuente
Python + Webcam
Usando código robado descaradamente desde aquí , toma una captura de pantalla usando su cámara web, procesa los datos e imprime el bit menos significativo.
fuente
Perl
Comprueba el tiempo de respuesta de su disco duro, cronometrando tres operaciones:
Finalmente, el tiempo necesario se empaqueta como flotante y se utiliza el undécimo bit más significativo (el segundo bit más significativo de la mantisa).
fuente
Golpetazo
sensors
imprime las temperaturas actuales del sistema junto con la velocidad del ventilador.sed 's/[^1-9]/+/g'
convierte cada cero y no dígito en signos más, y echo$[...0&1]
imprime la paridad de la suma resultante.Regex y cálculo de paridad tomados de la respuesta de dennis.
fuente
Golpetazo
Utiliza todo, por si acaso ...
Depende de
/sys
o/proc
)/proc/<pid>/s*
(por ejemplo, sched / schedstat) dependen de la velocidad del hardware necesario para dar vida a esos procesos.El tiempo de ejecución en mi sistema es de ~ 10 segundos, pero puede variar mucho. Especialmente no ejecute esto como root, o al menos modifíquelo para excluirlo
/proc/kcore
(a menos que esté dispuesto a pasar mucho tiempo para incluir la entropía contenida allí, que probablemente realmente lo incluiría todo)fuente
Shell + Wi-Fi
Pone la tarjeta wi-fi en modo monitor, descarga 30 segundos de los paquetes recibidos (incluidos los datos cifrados ilegibles de las redes vecinas), toma el hash sha512 de los datos del paquete y devuelve 1 si la primera letra del hash es 0-7 . Asume que su tarjeta wi-fi es
wlan0
y que actualmente no tiene unmon0
dispositivo.Si no hay dispositivos wi-fi cercanos, la salida será predecible, ya que siempre será la misma.
fuente
Los modernos procesadores compatibles con 8086 fabricados por Intel contienen un periférico de fácil acceso que genera una aleatoriedad adecuada. La conducción de ese periférico se realiza utilizando la
rdrand
instrucción que genera un patrón de bits aleatorio o establece el indicador de acarreo si el periférico no está disponible o está fuera de entropía.El siguiente programa corto para 80386 Linux comprueba si el periférico está disponible mediante la
cpuid
instrucción e intenta generar un número aleatorio. Si el número periférico o aleatorio no está disponible, el programa finalizará con un estado de1
. Si se podría generar un número aleatorio, ya sea un1
o una0
se imprime y las termina con el código de salida del programa0
.Guardar como
rand.s
y ensamblar conAquí está toda la asamblea:
Y un volcado de los 77 bytes resultantes de código de máquina:
fuente
rdrand
no es un generador de números aleatorios. Es un periférico hecho para que la NSA se meta con la criptografía de las personas.golpetazo
Apuntando al método de recopilación de números aleatorios más innecesariamente costoso. Calcule cuánto tiempo lleva generar emacs un millón de veces, luego use el truco de Dennis para convertir el tiempo que toma en un solo booleano (toma alrededor de 7 segundos en mi máquina).
fuente
Arduino Mega1280
editar: versión actualizada que es robusta contra cualquier cosa conectada a los pines. La idea se basa en el hecho de que el ATMega1280 usa un oscilador interno separado para el oscilador de vigilancia. Simplemente configuro una interrupción de vigilancia que establece una bandera, tengo un contador basado en el reloj del sistema (en el Arduino, este es un cristal externo de 16MHz) y permite que la fluctuación / variación del reloj haga el trabajo.
fuente
Javascript
http://jsfiddle.net/prankol57/9a6s0gmv/
Toma entrada de video.
Puede ver la captura de pantalla que utilizó para calcular el número aleatorio.
fuente
Shell en Linux
Mida la velocidad de lectura de un disco duro + tiempo de acceso de un directorio actualizado con frecuencia en este disco cuyo diseño es impredecible.
requiere:
Este enfoque tiene la ventaja de no modificar ningún dato en el sistema y no requiere perl sobre el de primo.
fuente
Cáscara
Probado en Linux, pero ¿quizás tu U * IX también tenga / proc / stat?
Esto inicia solo un proceso adicional, lee solo un archivo adicional (ni siquiera en el disco) y tiene 37 caracteres. También es bastante rápido.
Uno puede pensar que esto está determinado por todos los estados del proceso de kernel y userland, pero ese no es el caso, ya que / proc / stat también incluye el tiempo de espera de E / S, el tiempo para interrumpir las interrupciones de hardware, el tiempo dedicado a la tarea inactiva y algunos otros que todos depende de la entrada de hardware externo.
fuente
Matlab
La solución de micrófono:
Graba 10 segundos de sonido, encuentra el número de muestras negativas en la grabación y emite 0 si este número es par y 1 si es impar. Entonces 0 con 50% de probabilidad. El enfoque significa que incluso pequeñas cantidades de ruido, inevitables en una grabación silenciosa, serán suficientes para generar una salida aleatoria. El siguiente código un poco más largo acelera el generador de números mediante el uso de una grabación más corta, compensada con una tasa de bits más alta, lo que genera más ruido.
En una prueba en condiciones silenciosas, encuentro que en 100 ejecuciones del último código, el código genera cero 51 veces. 100 corridas en condiciones ruidosas produjeron cero 40 veces.
Editar: Gracias a Emil por señalar una falla en el código original :-)
fuente
Golpetazo
(Gracias, Dennis)
fuente
w
muestra una lista de usuarios conectados, que puede estar vacía. La carga del sistema se basa en la longitud de la cola de la CPU.w
contop
.Toma el bit menos significativo del acelerómetro de la computadora (necesita el
hdaps
módulo Linux):Básicamente, esto mide el ruido del sensor.
fuente
SmileBASIC
Utiliza el sensor de movimiento del 3DS. El eje Z del acelerómetro generalmente está alrededor de -1 (debido a la gravedad), y debido al ruido aleatorio, a veces puede estar por encima o por debajo de eso.
Aquí hay uno que usa el micrófono:
fuente
Golpetazo
Tomé la propia sugerencia de Soham (usando
top
):Editar: Funciona de la misma manera que Soham's. Convierte todos los caracteres no numéricos en la salida de top en '+' y luego evalúa la paridad de la cadena resultante.
la bandera 'b' hacia arriba lo ejecuta en modo por lotes para que informe todos los procesos, no solo la primera pantalla y 'n1' dice que solo se ejecute 1 iteración de arriba.
fuente