Tugas Anda adalah mengimprovisasi generator nomor acak perangkat keras dengan perangkat keras apa pun yang Anda miliki.
Tantangan
Tulis program dengan properti berikut:
- Mencetak baik
0
atau1
(dan tidak ada yang lain). - Outputnya tergantung pada proses fisik dan bukan hanya keadaan internal komputer.
- Tidak ada hubungan antara output berjalan berikutnya (terpisah satu menit).
- Output tidak dapat diprediksi dengan upaya realistis.
- Probabilitas output
0
adalah antara 0,2 dan 0,8. - Ini berjalan dalam waktu kurang dari satu menit dengan probabilitas yang cukup tinggi.
Anda harus menjelaskan mengapa program Anda memiliki properti ini, jika tidak jelas.
Klarifikasi dan Batasan
Berikut ini mungkin tampak seperti banyak sekali pembatasan untuk kontes popularitas, tetapi pada akhirnya itu semua untuk memastikan bahwa program tetap dalam semangat pertanyaan, agak berhasil dan untuk menghindari solusi yang populer karena menjadi total berlebihan tetapi secara ultimatif agak membosankan.
- Waktu sistem tidak dihitung sebagai proses fisik.
- Anda dapat menggunakan perangkat keras tingkat konsumen apa pun yang Anda suka dari cakram floopy-disk 8 inci ke peluncur roket USB ke headphone - kecuali jika itu dimaksudkan untuk pembangkitan angka acak. Sebuah perangkat keras adalah kelas konsumen, jika diproduksi secara massal dan harganya kurang dari $ 1000 / €, sehingga Anda tidak dapat menggunakan teleskop radio, CERN, MRI atau detektor partikel buatan rumah Anda.
- Anda hanya dapat membuat asumsi paling mendasar tentang status dan penyelarasan perangkat keras seperti dihidupkan (jika memiliki saklar daya) dan terpasang dengan baik dan fungsional. Misalnya, Anda dapat menganggap drive CD umumnya mampu membaca disk dan tidak macet, tetapi Anda tidak dapat menganggap itu drive terbuka atau tertutup atau mengandung disk. Dalam contoh lain Anda tidak dapat mengasumsikan dua buah perangkat keras yang akan disejajarkan untuk memungkinkan interaksi khusus, tetapi Anda dapat menganggap mereka berada di ruangan yang sama.
- Anda dapat meninggalkan perangkat keras dalam keadaan apa pun yang Anda suka, kecuali jika Anda merusaknya.
- Anda dapat dan harus menganggap perangkat keras berada di lingkungan alami, tetapi tidak lebih. Misalnya, Anda dapat mengasumsikan bahwa perangkat keras tidak diposisikan di dalam tangki helium cair atau di ruang yang sangat kedap suara dan ringan atau di ruang angkasa. Namun, Anda tidak dapat mengasumsikan sumber suara dan cahaya apa pun ada kecuali yang hanya bisa dihindari dengan upaya radikal.
- Program Anda harus dijalankan pada komputer desktop standar dengan sistem operasi non-esoterik pilihan Anda. Anda dapat menggunakan perangkat lunak apa pun yang tidak dirancang khusus untuk pembuatan angka acak.
- Anda tidak dapat mengambil akses Internet.
- Anda tidak dapat menganggap manusia hadir atau tidak ada, tetapi Anda dapat mengasumsikan bahwa tidak ada orang yang dengan sengaja mengganggu program Anda, misalnya, dengan menghentikan kipas angin secara manual atau menjalankan program yang tidak melakukan apa pun selain mematikan mikrofon sesering mungkin.
- Anda hanya dapat membuat asumsi paling mendasar tentang pengaturan perangkat lunak. Misalnya, Anda dapat menganggap driver diinstal dan diaktifkan tetapi Anda harus siap untuk suara yang akan dimatikan.
- Anda dapat meninggalkan pengaturan perangkat lunak dalam kondisi apa pun yang Anda suka.
Bonus
Hadiah khusus diberikan untuk solusi yang sangat singkat. Ini bukan dengan jumlah instruksi dan mirip dengan oleh karakter. Para pemenang (diikat sesuai dengan kriteria saya):
- Jawaban ini oleh Franki.
- Jawaban ini oleh Tejas Kale.
Saya hanya bisa memberikan satu jawaban dan jawaban Tejas Kale dimenangkan banyak.
sumber
Jawaban:
Kulit
Membaca sampel tunggal dari aliran mikrofon dan mencetak bit yang paling tidak signifikan, yang harus didominasi oleh noise.
EDIT: Diubah untuk mengaktifkan mikrofon ... dan yang lainnya juga!
sumber
cat /dev/urandom > /dev/dsp
, kalau-kalau komputer berada di ruang / ruang / kotak / case / ruang kedap suara.Pesta
Mengumpulkan entropi dari waktu respons satu ping ke localhost.
Perhatikan bahwa waktu respons muncul persis tiga kali dalam output
ping -qc1
:Semua angka lain dan konstan dan - lebih penting - independen dari waktu respons.
sed 's/[^1-9]/+/g'
mengubah setiap nol dan non-digit menjadi tanda plus, danecho $[...0&1]
mencetak paritas dari jumlah yang dihasilkan.sumber
CYGWIN_NT-6.2-WOW64 work 1.7.28(0.271/5/3) 2014-02-09 21:06 i686 Cygwin
-ping
tidak memiliki-q
atau di-c
sini.ping
dikonfirmasi. Aku terkejut.JavaScript + HTML5 DeviceMotion
JSFiddle di sini .
Menggunakan HTML5 DeviceMotion API pada perangkat yang didukung (kebanyakan perangkat seluler). Ini mengubah
acceleration
objek yang dihasilkan menjadi JSON, hash itu, dan mengambil modulo 2 sisanya.Sebagian besar kode adalah fungsi hash (JavaScript sialan, dan total Anda tidak memiliki perpustakaan standar). Mungkin bisa lebih pendek, tapi saya payah untuk fungsi hash yang baik.
sumber
Python + Webcam
Menggunakan kode yang dicuri tanpa malu-malu dari sini , mengambil gambar dengan menggunakan webcam Anda, hash data, dan mencetak bit yang paling tidak signifikan.
sumber
Perl
Periksa waktu respons Harddrive Anda, dengan menentukan waktu tiga operasi:
Akhirnya, waktu yang diambil dikemas sebagai pelampung, dan bit ke-11 paling signifikan digunakan (bit paling signifikan kedua dari mantissa).
sumber
Pesta
sensors
mencetak suhu sistem saat ini bersama dengan kecepatan kipas.sed 's/[^1-9]/+/g'
mengkonversi setiap nol dan non-digit menjadi tanda plus, dan gema$[...0&1]
mencetak paritas dari jumlah yang dihasilkan.Regex dan perhitungan paritas dipinjam dari jawaban dennis.
sumber
Pesta
Menggunakan semuanya, untuk berjaga-jaga ...
Tergantung pada
/sys
atau/proc
)/proc/<pid>/s*
(mis. sched / schedstat) bergantung pada kecepatan perangkat keras yang diperlukan untuk menghidupkan proses tersebut.Runtime pada sistem saya adalah ~ 10s, tetapi dapat sangat bervariasi. Terutama jangan menjalankan ini sebagai root, atau setidaknya memodifikasinya untuk mengecualikan
/proc/kcore
(kecuali jika Anda bersedia menghabiskan banyak waktu untuk memasukkan entropi yang terkandung di sana, yang mungkin akan benar-benar mencakup semuanya)sumber
Shell + Wi-Fi
Masukkan kartu wi-fi ke dalam mode monitor, menerima paket senilai 30 detik yang diterima (termasuk data terenkripsi yang tidak terbaca dari jaringan tetangga), mengambil hash sha512 dari data paket, dan mengembalikan 1 jika huruf pertama hash adalah 0-7 . Berasumsi bahwa kartu wi-fi Anda adalah
wlan0
, dan saat ini Anda tidak memilikimon0
perangkat.Jika tidak ada perangkat wi-fi terdekat, maka hasilnya akan dapat diprediksi, karena akan selalu sama setiap waktu.
sumber
Prosesor kompatibel modern 8086 yang diproduksi oleh Intel mengandung periferal yang mudah diakses yang menghasilkan keacakan yang tepat. Mengemudi periferal itu dilakukan dengan menggunakan
rdrand
instruksi yang menghasilkan pola bit acak atau menetapkan flag carry jika periferal tidak tersedia atau keluar dari entropi.Program singkat berikut untuk 80386 Linux memeriksa apakah perangkat tersedia dengan
cpuid
instruksi dan mencoba untuk menghasilkan nomor acak. Jika salah satu perangkat atau nomor acak tidak tersedia, program akan berakhir dengan status1
. Jika nomor acak dapat dihasilkan, baik a1
atau a0
dicetak dan program berakhir dengan status keluar0
.Simpan sebagai
rand.s
dan berkumpul denganInilah seluruh majelis:
Dan dump dari 77 byte kode mesin yang dihasilkan:
sumber
rdrand
bukan generator angka acak. Ini adalah perangkat yang dibuat untuk NSA untuk mengacaukan kriptografi orang.pesta
Bertujuan untuk metode pengumpulan angka acak yang paling mahal dan tidak perlu. Waktu berapa lama untuk menelurkan emacs sejuta kali, kemudian gunakan trik Dennis 'untuk mengubah waktu yang diambil menjadi Boolean tunggal (membutuhkan sekitar 7 detik pada mesin saya).
sumber
Arduino Mega1280
sunting: versi terbaru yang kuat terhadap segala yang dicolokkan ke pin. Idenya bergantung pada fakta bahwa ATMega1280 menggunakan osilator internal yang terpisah untuk osilator pengawas. Saya cukup mengatur pengawas interupsi yang menetapkan bendera, memiliki penghitung berdasarkan jam sistem (pada Arduino ini adalah kristal eksternal 16MHz), dan memungkinkan clock jitter / varian melakukan pekerjaan.
sumber
Javascript
http://jsfiddle.net/prankol57/9a6s0gmv/
Mengambil input video.
Anda dapat melihat tangkapan layar yang digunakan untuk menghitung angka acak.
sumber
Shell di Linux
Ukur kecepatan baca hard drive + waktu akses dari direktori yang sering diperbarui pada disk ini yang tata letaknya tidak dapat diprediksi.
membutuhkan:
Pendekatan ini memiliki keuntungan karena tidak memodifikasi data apa pun pada sistem dan tidak memerlukan perl lebih dari yang primer.
sumber
Kulit
Diuji di Linux, tetapi mungkin U * IX Anda memang memiliki / proc / stat juga?
Ini hanya memulai satu proses tambahan, membaca hanya satu file tambahan (bahkan pada disk) dan pendeknya 37 karakter. Ini juga cukup cepat.
Orang mungkin berpikir bahwa ini ditentukan oleh semua status proses kernel dan userland, tetapi bukan itu masalahnya, karena / proc / stat juga termasuk waktu tunggu IO, waktu untuk menyelesaikan gangguan perangkat keras, waktu yang dihabiskan dalam tugas menganggur dan beberapa lainnya yang semuanya tergantung pada input perangkat keras eksternal.
sumber
Matlab
Solusi mikrofon:
Merekam 10 detik suara, menemukan jumlah sampel negatif dalam rekaman dan menghasilkan 0 jika angka ini genap dan 1 jika aneh. Jadi 0 dengan probabilitas 50%. Pendekatan ini berarti bahwa bahkan jumlah kecil noice, yang tidak dapat dihindari dalam rekaman diam, akan cukup untuk menghasilkan keluaran acak. Kode yang sedikit lebih panjang berikut ini mempercepat generator angka dengan menggunakan rekaman yang lebih pendek, dikompensasi dengan bitrate yang lebih tinggi, yang memberikan lebih banyak noise.
Dalam pengujian dalam kondisi tenang, saya menemukan bahwa dalam 100 kali menjalankan kode yang terakhir, kode output nol 51 kali. 100 berjalan dalam kondisi bising menghasilkan nol 40 kali.
Sunting: Terima kasih kepada Emil karena menunjukkan kesalahan pada kode asli :-)
sumber
Pesta
(Terima kasih, Dennis.)
sumber
w
menampilkan daftar pengguna yang masuk, yang bisa kosong. Beban sistem didasarkan pada panjang antrian CPU.w
dengantop
.Mengambil sedikit signifikan dari accelerometer komputer (membutuhkan
hdaps
modul Linux):Ini pada dasarnya mengukur kebisingan sensor.
sumber
SmileBASIC
Menggunakan sensor gerak 3DS. Sumbu Z accelerometer biasanya sekitar -1 (karena gravitasi), dan karena noise acak, kadang-kadang bisa di atas atau di bawah itu.
Inilah yang menggunakan mikrofon:
sumber
Pesta
Saya mengambil saran Soham sendiri (menggunakan
top
):Sunting: Ini bekerja dengan cara yang sama seperti yang dilakukan Soham. Ini mengubah semua karakter non numerik di output atas menjadi '+' dan kemudian mengevalusi paritas string yang dihasilkan.
flag 'b' menjalankannya dalam mode batch sehingga melaporkan semua proses, bukan hanya screenful pertama dan 'n1' mengatakan untuk hanya menjalankan 1 iterasi atas.
sumber