Votre tâche consiste à improviser un générateur de nombre aléatoire de matériel avec le matériel que vous possédez.
Défi
Ecrivez un programme avec les propriétés suivantes:
- Il imprime soit
0
ou1
(et rien d'autre). - La sortie dépend d'un processus physique et pas seulement de l'état interne de l'ordinateur.
- Il n'y a pas de relation entre les sorties des analyses suivantes (à une minute d'intervalle).
- La sortie n'est pas prévisible avec aucun effort réaliste.
- La probabilité que la sortie soit
0
comprise entre 0,2 et 0,8. - Il s'exécute en moins d'une minute avec une probabilité raisonnablement élevée.
Vous devez expliquer pourquoi votre programme possède ces propriétés, si ce n’est pas évident.
Clarifications et restrictions
Ce qui suit peut sembler énormément de restrictions pour un concours de popularité, mais en fin de compte, tout est fait pour que le programme reste dans l'esprit de la question, fonctionne un peu et pour éviter les solutions qui sont populaires parce qu'elles sont excessives mais ultimement plutôt ennuyant.
- L’heure du système ne compte pas comme un processus physique.
- Vous pouvez utiliser n'importe quel matériel grand public que vous aimez, des lecteurs de disque floopy de 8 pouces au lance- roquettes USB en passant par les écouteurs - sauf s'il est destiné à la génération de nombres aléatoires. Une pièce de matériel est de qualité grand public, si elle est produite en série et coûte moins de 1000 $ / € / £ / £, vous ne pouvez donc pas utiliser les radiotélescopes, le CERN, les IRM ou votre détecteur de particules construit à la maison.
- Vous pouvez uniquement émettre les hypothèses de base sur l'état et l'alignement du matériel, par exemple être allumé (s'il dispose d'un commutateur d'alimentation), être correctement installé et fonctionnel. Par exemple, vous pouvez supposer qu'un lecteur de CD est généralement capable de lire un disque et ne pas être bloqué, mais vous ne pouvez pas supposer qu'il est ouvert ou fermé ou qu'il contient un disque. Dans un autre exemple, vous ne pouvez pas supposer que deux composants matériels sont alignés pour permettre une interaction spéciale, mais vous pouvez également supposer qu'ils se trouvent dans la même pièce.
- Vous pouvez laisser le matériel dans l'état de votre choix, à moins que vous ne le cassiez.
- Vous pouvez et devez supposer que le matériel se trouve dans un environnement naturel, mais rien de plus. Par exemple, vous pouvez supposer que le matériel n'est pas placé dans un réservoir d'hélium liquide ni dans une pièce extrêmement insonorisée et insonorisée, ni dans un espace. Cependant, vous ne pouvez pas présumer de la présence de sources sonores ou lumineuses, à l'exception de celles qui ne peuvent être évitées qu'avec des efforts radicaux.
- Votre programme doit être exécuté sur un ordinateur de bureau standard avec un système d'exploitation non ésotérique de votre choix. Vous pouvez utiliser tout logiciel non spécialement conçu pour la génération de nombres aléatoires.
- Vous ne pouvez pas supposer un accès Internet.
- Vous ne pouvez pas supposer que les humains sont présents ni absents, mais vous pouvez supposer que personne ne gêne intentionnellement votre programme, par exemple, en arrêtant manuellement un ventilateur ou en exécutant un programme qui ne fait rien, mais éteint le microphone aussi souvent que possible.
- Vous ne pouvez faire que les hypothèses les plus élémentaires sur les paramètres du logiciel. Par exemple, vous pouvez supposer que les pilotes sont installés et activés, mais vous devez être prêt pour que le son soit mis en sourdine.
- Vous pouvez laisser les paramètres du logiciel dans l'état de votre choix.
Prime
Une prime spéciale a été attribuée à une solution particulièrement courte. C'était plutôt par nombre d'instructions et similaire que par caractères. Les gagnants étaient (à égalité selon mes critères):
- Cette réponse de Franki.
- Cette réponse de Tejas Kale.
Je n'ai pu attribuer qu'une seule réponse et celle de Tejas Kale a été tirée au sort.
la source
Réponses:
coquille
Lit un seul échantillon du flux de microphone et imprime son bit le moins significatif, qui devrait être dominé par le bruit.
EDIT: Modifié pour réactiver le microphone ... et tout le reste aussi!
la source
cat /dev/urandom > /dev/dsp
, juste au cas où l’ordinateur se trouve dans une pièce / chambre / boîtier / boîtier insonorisé.Frapper
Recueille l'entropie du temps de réponse d'un seul ping à localhost.
Notez que le temps de réponse apparaît exactement trois fois dans la sortie de
ping -qc1
:Tous les autres chiffres et constants et - plus important encore - indépendants du temps de réponse.
sed 's/[^1-9]/+/g'
convertit chaque zéro et chaque chiffre non numérique en signes plus etecho $[...0&1]
imprime la parité de la somme résultante.la source
CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin
-ping
n'a ni-q
ou-c
ici.ping
confirmée. Je suis surpris.JavaScript + HTML5 DeviceMotion
JSFiddle ici .
Utilise l'API HTML5 DeviceMotion sur les appareils pris en charge (principalement les appareils mobiles). Il transforme l'
acceleration
objet résultant en JSON, le hache et prend le reste modulo 2.La majeure partie du code est la fonction de hachage (putain de JavaScript, et de votre absence totale d'une bibliothèque standard). Il pourrait probablement être plus court, mais je suis une ventouse pour une bonne fonction de hachage.
la source
Python + Webcam
Utiliser du code volé sans vergogne à partir d’ ici , prend un cliché en utilisant votre webcam, hache les données et affiche le bit le moins significatif.
la source
Perl
Vérifie le temps de réponse de votre disque dur en chronométrant trois opérations:
Enfin, le temps pris est stocké sous forme de float et le 11ème bit le plus significatif est utilisé (le second bit le plus significatif de la mantisse).
la source
Frapper
sensors
imprime les températures actuelles du système ainsi que la vitesse du ventilateur.sed 's/[^1-9]/+/g'
convertit chaque zéro et chaque chiffre non numérique en signes plus et echo$[...0&1]
imprime la parité de la somme résultante.Calcul de la regex et de la parité emprunté à la réponse de dennis.
la source
Frapper
Utilise tout, juste au cas où ...
Dépend de
/sys
ou/proc
)/proc/<pid>/s*
(par exemple, sched / schedstat) dépendent de la vitesse du matériel nécessaire pour mettre ces processus en activité.Le temps d’exécution sur mon système est d'environ 10 secondes, mais peut varier considérablement. Surtout, ne lancez pas cela en tant que root, ou du moins modifiez-le pour l'exclure
/proc/kcore
(à moins que vous ne souhaitiez passer beaucoup de temps à inclure l'entropie qui y est contenue, ce qui inclurait probablement vraiment tout)la source
Shell + Wi-Fi
Met la carte wi-fi en mode moniteur, affiche 30 secondes de paquets reçus (y compris des données cryptées illisibles provenant de réseaux voisins), prend le hachage sha512 des données du paquet et renvoie 1 si la première lettre du hachage est 0-7 . Suppose que votre carte Wi-Fi est
wlan0
, et que vous n'avez pas d'mon0
appareil.S'il n'y a pas d'appareils Wi-Fi à proximité, la sortie sera prévisible, car elle sera la même à chaque fois.
la source
Les processeurs modernes compatibles Intel 8086 fabriqués par Intel contiennent un périphérique facilement accessible générant un caractère aléatoire adéquat. Le pilotage de ce périphérique s'effectue à l'aide de l'
rdrand
instruction qui génère un modèle de bits aléatoire ou active l'indicateur de retenue si le périphérique est indisponible ou ne présente pas d'entropie.Le programme court suivant pour 80386 Linux vérifie si le périphérique est disponible au moyen de l’
cpuid
instruction et essaie de générer un nombre aléatoire. Si le périphérique ou un nombre aléatoire n'est pas disponible, le programme se termine avec le statut1
. Si un nombre aléatoire peut être généré, un1
ou un0
est imprimé et le programme se termine avec le statut de sortie0
.Enregistrer sous
rand.s
et assembler avecVoici l'assemblage complet:
Et une sauvegarde des 77 octets de code machine obtenus:
la source
rdrand
n'est pas un générateur de nombres aléatoires. C'est un périphérique conçu pour que la NSA puisse manipuler la cryptographie des gens.frapper
Viser la méthode la plus inutile de collecte de nombres aléatoires. Indiquez combien de temps il faut pour générer emacs un million de fois, puis utilisez l’astuce de Dennis pour transformer le temps pris en un simple booléen (prend environ 7 secondes sur ma machine).
la source
Arduino Mega1280
edit: version mise à jour qui est robuste contre tout ce qui est branché sur les broches. L'idée repose sur le fait que l'ATMega1280 utilise un oscillateur interne séparé pour l'oscillateur de surveillance. Je configure simplement une interruption de chien de garde qui définit un drapeau, un compteur basé sur l'horloge système (sur l'Arduino, il s'agit d'un cristal externe de 16 MHz) et permet à la gigue et à la variance de faire le travail.
la source
Javascript
http://jsfiddle.net/prankol57/9a6s0gmv/
Prend une entrée vidéo.
Vous pouvez voir la capture d'écran utilisée pour calculer le nombre aléatoire.
la source
Shell sur Linux
Mesurer la vitesse de lecture d'un disque dur + le temps d'accès d'un répertoire fréquemment mis à jour sur ce disque, dont la disposition est imprévisible.
a besoin:
Cette approche a l'avantage de ne modifier aucune donnée sur le système et de ne pas nécessiter de perl par rapport à celui de primo.
la source
coquille
Testé sur Linux, mais peut-être que votre U * IX a également / proc / stat?
Cela ne démarre qu’un seul processus supplémentaire, lit un seul fichier supplémentaire (même sur disque) et contient 37 caractères. C'est aussi assez rapide.
On peut penser que ceci est déterminé par tous les états de processus du noyau et de l’utilisateur, mais ce n’est pas le cas, car / proc / stat inclut dépendent de l'entrée matérielle externe.
la source
Matlab
La solution de microphone:
Enregistre 10 secondes de son, recherche le nombre d'échantillons négatifs dans l'enregistrement et génère 0 si ce nombre est pair et 1 s'il est impair. Donc 0 avec une probabilité de 50%. Cette approche signifie que même de petites quantités de bruit, inévitables dans un enregistrement silencieux, seront suffisantes pour générer une sortie aléatoire. Le code légèrement plus long suivant accélère le générateur de numéros en utilisant un enregistrement plus court, compensé par un débit binaire plus élevé, ce qui génère plus de bruit.
Dans un test dans des conditions calmes, je trouve que sur 100 exécutions du dernier code, le code affiche zéro 51 fois. 100 courses dans des conditions bruyantes ont été produites zéro à 40 fois.
Edit: Merci à Emil pour avoir signalé une faille dans le code original :-)
la source
Frapper
(Merci, Dennis.)
la source
w
affiche une liste des utilisateurs connectés, qui peuvent être vides. La charge du système est basée sur la longueur de la file d'attente de la CPU.w
partop
.Prend le bit le moins significatif de l'accéléromètre de l'ordinateur (nécessite le
hdaps
module Linux):Cela mesure essentiellement le bruit du capteur.
la source
SmileBASIC
Utilise le capteur de mouvement de la 3DS. L'axe Z de l'accéléromètre se situe généralement autour de -1 (en raison de la gravité) et, en raison du bruit aléatoire, il peut parfois être supérieur ou inférieur à celui-ci.
En voici un qui utilise le microphone:
la source
Frapper
J'ai pris la suggestion de Soham (en utilisant
top
):Edit: Cela fonctionne de la même manière que Soham. Il transforme tous les caractères non numériques de la sortie de top en '+', puis évite la parité de la chaîne résultante.
l'indicateur 'b' en haut le lance en mode batch de manière à signaler tous les processus, pas seulement le premier écran et 'n1' indique d'exécuter une seule itération de top.
la source