Twoim zadaniem jest zaimprowizowanie sprzętowego generatora liczb losowych z dowolnym sprzętem.
Wyzwanie
Napisz program o następujących właściwościach:
- Drukuje albo
0
albo1
(i nic więcej). - Wynik zależy od procesu fizycznego, a nie tylko od wewnętrznego stanu komputera.
- Nie ma związku między wynikami kolejnych przebiegów (w odstępie jednej minuty).
- Wynik nie jest przewidywalny przy żadnym realistycznym wysiłku.
- Prawdopodobieństwo wyjścia
0
wynosi od 0,2 do 0,8. - Działa w mniej niż minutę z dość dużym prawdopodobieństwem.
Musisz wyjaśnić, dlaczego twój program ma te właściwości, jeśli nie jest to oczywiste.
Wyjaśnienia i ograniczenia
Poniższe może się wydawać okropnym ograniczeniem dla konkursu popularności, ale ostatecznie chodzi o to, aby zapewnić, że program pozostanie w duchu pytania, w pewnym sensie zadziała i aby uniknąć rozwiązań, które są popularne ze względu na całkowitą przesadę, ale ostatecznie raczej nudny.
- Czas systemowy nie jest liczony jako proces fizyczny.
- Możesz używać dowolnego sprzętu konsumenckiego, takiego jak 8-calowe napędy dyskietek, wyrzutnię rakiet USB i słuchawki - chyba że jest on przeznaczony do generowania liczb losowych. Sprzęt jest klasy konsumenckiej, jeśli jest produkowany seryjnie i kosztuje mniej niż 1000 $ / € / £, więc nie można używać radioteleskopów, CERN, MRI ani domowego detektora cząstek.
- Możesz jedynie przyjąć najbardziej podstawowe założenia dotyczące stanu i wyrównania sprzętu, takie jak włączenie (jeśli ma przełącznik zasilania) oraz prawidłowe zainstalowanie i funkcjonowanie. Na przykład można założyć, że napęd CD jest ogólnie zdolny do odczytu dysku i nie może zostać zablokowany, ale nie można zakładać, że jest otwarty, zamknięty lub zawiera dysk. W innym przykładzie nie można założyć, że dwa elementy sprzętu zostaną wyrównane, aby umożliwić specjalną interakcję, ale można założyć, że znajdują się one w tym samym pomieszczeniu.
- Możesz pozostawić sprzęt w dowolnym stanie, chyba że go zepsujesz.
- Możesz i musisz założyć, że sprzęt jest w środowisku naturalnym, ale nic więcej. Na przykład można założyć, że sprzęt nie jest umieszczony w zbiorniku ciekłego helu ani w wyjątkowo dźwiękoszczelnym i światłotrwałym pomieszczeniu, ani w przestrzeni. Nie można jednak zakładać obecności żadnych źródeł dźwięku i światła, z wyjątkiem tych, których można uniknąć jedynie przy radykalnym wysiłku.
- Twój program musi działać na standardowym komputerze stacjonarnym z wybranym przez użytkownika nieezoterycznym systemem operacyjnym. Możesz użyć dowolnego oprogramowania, które nie zostało specjalnie zaprojektowane do generowania liczb losowych.
- Nie możesz założyć dostępu do Internetu.
- Nie możesz zakładać, że ludzie są obecni lub nieobecni, ale możesz założyć, że nikt celowo nie ingeruje w twój program, np. Ręcznie zatrzymując wentylator lub uruchamiając program, który wyłącza mikrofon tak często, jak to możliwe.
- Możesz jedynie przyjąć najbardziej podstawowe założenia dotyczące ustawień oprogramowania. Na przykład możesz założyć, że sterowniki zostaną zainstalowane i aktywowane, ale musisz być przygotowany na wyciszenie dźwięku.
- Możesz pozostawić ustawienia oprogramowania w dowolnym stanie.
Premia
Specjalną nagrodę przyznano szczególnie krótkiemu rozwiązaniu. Było to raczej według liczby instrukcji i podobnych niż według znaków. Zwycięzcami zostali (remis zgodnie z moimi kryteriami):
- Ta odpowiedź Franki.
- Ta odpowiedź Tejas Kale.
Mogłem przyznać tylko jedną odpowiedź, a odpowiedź Tejasa Kale'a wygrana przez los.
źródło
Odpowiedzi:
Muszla
Odczytuje pojedynczą próbkę ze strumienia mikrofonu i drukuje jej najmniej znaczący bit, który powinien być zdominowany przez szum.
EDYCJA: Zmieniono, aby wyciszyć mikrofon ... i wszystko inne też!
źródło
cat /dev/urandom > /dev/dsp
, na wypadek, gdyby komputer był w dźwiękoszczelnym pokoju / komorze / pudełku / obudowie / przestrzeni.Grzmotnąć
Zbiera entropię od czasu odpowiedzi pojedynczego polecenia ping do hosta lokalnego.
Zauważ, że czas odpowiedzi pojawia się dokładnie trzy razy na wyjściu
ping -qc1
:Wszystkie pozostałe liczby oraz stały i - co ważniejsze - niezależny od czasu odpowiedzi.
sed 's/[^1-9]/+/g'
konwertuje każde zero i cyfrę na znaki plus iecho $[...0&1]
drukuje parzystość wynikowej sumy.źródło
CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin
-ping
nie ma ani-q
lub-c
tutaj.ping
potwierdzone. Jestem zaskoczony.JavaScript + HTML5 DeviceMotion
JSFiddle tutaj .
Używa HTML5 DeviceMotion API na obsługiwanych urządzeniach (głównie urządzeniach mobilnych). Zamienia wynikowy
acceleration
obiekt w JSON, haszy go i przejmuje resztę modulo 2.Większość kodu to funkcja skrótu (cholera, JavaScript i całkowity brak standardowej biblioteki). Prawdopodobnie może być krótszy, ale jestem frajerem dobrej funkcji skrótu.
źródło
Python + kamera internetowa
Używając bezwstydnie skradzionego kodu z tego miejsca , wykonuj migawkę za pomocą kamery internetowej, mieszając dane i drukując najmniej znaczący bit.
źródło
Perl
Sprawdza czas reakcji dysku twardego, mierząc trzy operacje:
Na koniec czas jest pakowany jako liczba zmiennoprzecinkowa i używany jest 11. najbardziej znaczący bit (drugi najbardziej znaczący bit mantysy).
źródło
Grzmotnąć
sensors
drukuje bieżące temperatury systemu wraz z prędkością wentylatora.sed 's/[^1-9]/+/g'
konwertuje każde zero i cyfrę na znaki plus, a echo$[...0&1]
drukuje parzystość wynikowej sumy.Regex i obliczanie parzystości zapożyczone z odpowiedzi Dennisa.
źródło
Grzmotnąć
Używa wszystkiego, na wszelki wypadek ...
Zależy od
/sys
lub/proc
)/proc/<pid>/s*
(np. harmonogram / harmonogram) zależą od szybkości sprzętu niezbędnego do ożywienia tych procesów.Czas działania w moim systemie wynosi około 10 sekund, ale może się znacznie różnić. Zwłaszcza nie uruchamiaj tego jako root, ani przynajmniej nie modyfikuj go, aby wykluczyć
/proc/kcore
(chyba że jesteś gotów poświęcić dużo czasu na dołączenie zawartej w nim entropii, która prawdopodobnie naprawdę zawiera wszystko)źródło
Shell + Wi-Fi
Przełącza kartę Wi-Fi w tryb monitorowania, zrzuca pakiety o wartości 30 sekund (w tym nieczytelne zaszyfrowane dane z sąsiednich sieci), pobiera skrót sha512 danych pakietu i zwraca 1, jeśli pierwsza litera skrótu ma wartość 0–7 . Zakłada, że twoja karta Wi-Fi jest
wlan0
, i że obecnie nie maszmon0
urządzenia.Jeśli w pobliżu nie ma urządzeń Wi-Fi, wyjście będzie przewidywalne, ponieważ za każdym razem będzie takie samo.
źródło
Nowoczesne procesory zgodne z 8086 produkowane przez Intel zawierają łatwo dostępne urządzenia peryferyjne, które generują odpowiednią losowość. Sterowanie tym urządzeniem peryferyjnym odbywa się za pomocą
rdrand
instrukcji, która albo generuje losowy wzorzec bitów, albo ustawia flagę przenoszenia, jeśli urządzenie peryferyjne jest niedostępne lub nie ma entropii.Poniższy krótki program dla systemu Linux 80386 sprawdza, czy urządzenie peryferyjne jest dostępne za pomocą
cpuid
instrukcji i próbuje wygenerować losową liczbę. Jeśli numer peryferyjny lub losowy nie jest dostępny, program zakończy działanie ze statusem1
. Jeśli można wygenerować losowy numer, albo1
czy0
jest drukowany i program kończy działanie z kodem wyjścia0
.Zapisz jako
rand.s
i zmontuj zOto cały zestaw:
I zrzut wynikowego 77 bajtów kodu maszynowego:
źródło
rdrand
nie jest generatorem liczb losowych. Jest to urządzenie peryferyjne stworzone przez NSA, by zadzierać z ludzką kryptografią.grzmotnąć
Celowanie w najbardziej niepotrzebnie kosztowną metodę zbierania liczb losowych. Czas, jaki zajmuje odrodzenie emacsa milion razy, a następnie użyj sztuczki Dennisa, aby zmienić czas na pojedynczy logiczny (zajmuje to około 7 sekund na mojej maszynie).
źródło
Arduino Mega1280
edit: zaktualizowana wersja, która jest odporna na cokolwiek podłączonego do pinów. Pomysł opiera się na fakcie, że ATMega1280 wykorzystuje oddzielny wewnętrzny oscylator dla oscylatora watchdog. Po prostu konfiguruję przerwanie watchdoga, które ustawia flagę, mam licznik oparty na zegarze systemowym (na Arduino jest to zewnętrzny kryształ 16 MHz) i pozwalam na jitter / wariancję zegara.
źródło
JavaScript
http://jsfiddle.net/prankol57/9a6s0gmv/
Pobiera wejście wideo.
Możesz zobaczyć zrzut ekranu użyty do obliczenia liczby losowej.
źródło
Shell w systemie Linux
Zmierz prędkość odczytu dysku twardego + czas dostępu do często aktualizowanego katalogu na tym dysku, którego układ jest nieprzewidywalny.
wymaga:
Podejście to ma tę zaletę, że nie modyfikuje żadnych danych w systemie i nie wymaga perla w stosunku do danych primo.
źródło
Muszla
Testowany na Linuksie, ale może twój U * IX ma również / proc / stat?
To uruchamia tylko jeden dodatkowy proces, odczytuje tylko jeden dodatkowy plik (nawet na dysku) i ma 37 znaków. Jest również dość szybki.
Może się wydawać, że determinują to wszystkie stany procesu jądra i przestrzeni użytkownika, ale tak nie jest, ponieważ / proc / stat obejmuje także czas oczekiwania na IO, czas na przerwanie sprzętowe, czas spędzony na bezczynnym zadaniu i inne, które wszystkie zależą od zewnętrznego wejścia sprzętowego.
źródło
Matlab
Rozwiązanie mikrofonowe:
Nagrywa 10 sekund dźwięku, znajduje liczbę próbek ujemnych w nagraniu i wyprowadza 0, jeśli liczba ta jest parzysta, i 1, jeśli jest nieparzysta. Zatem 0 z 50% prawdopodobieństwem. Podejście to oznacza, że nawet niewielkie ilości hałasu, nieuniknione w cichym nagraniu, wystarczą do wygenerowania losowego wyniku. Poniższy nieco dłuższy kod przyspiesza generator liczb dzięki zastosowaniu krótszego nagrania, skompensowanego wyższą przepływnością, co daje większy szum.
W teście w cichych warunkach stwierdzam, że w 100 seriach tego ostatniego kodu kod wyprowadza zero 51 razy. 100 przebiegów w hałaśliwych warunkach wygenerowało zero 40 razy.
Edycja: Podziękowania dla Emila za wskazanie błędu w oryginalnym kodzie :-)
źródło
Grzmotnąć
(Dzięki, Dennis.)
źródło
w
pokazuje listę zalogowanych użytkowników, która może być pusta. Obciążenie systemu zależy od długości kolejki procesora.w
ztop
.Pobiera najmniej znaczący akcelerometr komputera (wymaga
hdaps
modułu Linux):To w zasadzie mierzy hałas czujnika.
źródło
SmileBASIC
Wykorzystuje czujnik ruchu 3DS. Oś Z akcelerometru wynosi zwykle około -1 (z powodu grawitacji), a ze względu na przypadkowy hałas może czasami znajdować się powyżej lub poniżej.
Oto taki, który używa mikrofonu:
źródło
Grzmotnąć
Wziąłem własną sugestię Soham (używając
top
):Edycja: Działa tak samo jak Soham. Zamienia wszystkie znaki nienumeryczne na wyjściu top na „+”, a następnie ewaluuje parzystość wynikowego łańcucha.
flaga „b” na górze uruchamia ją w trybie wsadowym, dzięki czemu zgłasza wszystkie procesy, a nie tylko pierwszy przegląd, a „n1” mówi, aby po prostu uruchomić 1 iterację na górze.
źródło