Komputer tidak keluar dari tempat membuat angka acak tanpa dasar, karena kemungkinan besar, waktu adalah dasar universal dari keacakan.
Saya ingin Anda membuat kode yang membuat angka acak dengan aturan ini:
- Waktu tidak boleh menjadi dasar, pada titik mana pun dari program ini.
- Fungsi acak / pseudo-acak yang telah ditentukan tidak diizinkan.
- Angka yang dihasilkan dapat berada dalam kisaran apa pun. Setidaknya dua bilangan bulat yang berbeda: D
- Angka digema.
popularity-contest
Dadan
sumber
sumber
Jawaban:
JavaScript
Itu tadi menyenangkan!
Saya menulis Mersenne Twister di JS. Kemudian, saya menyadari bahwa saya harus mendapatkan benih dari suatu tempat.
Jadi, saya memutuskan untuk mendapatkannya dari Stack Exchange API! (Saya bisa menggunakan
localStorage
dan menambah penghitung, tapi itu tidak menyenangkan.) Jadi, saya mengambil 10 jawaban yang paling aktif, dan kemudian saya hanya mengambil setiap 4 atau kurang digit berturut-turut dalam respons dan menambahkannya.Benih-benih ini selalu berbeda, karena Stack Overflow terus-menerus memperbarui (dan kuota saya terus turun!) Jumlahnya termasuk ID jawaban, ID pertanyaan, skor, jumlah naik / turun, rep pemilik / ID, dan data pembungkus (kuota dan semacamnya) ). Sekali jalan saya dapatkan
256845
, lalu270495
, dan kemudian256048
, dll ....Ini mencatat 10 angka komplemen acak 32-bit dua ke konsol. Output sampel:
sumber
Jawa
Keajaiban ada di
public NoTimeRandom()
. Array yang dilemparkan ke string dapat membingungkan programmer baru, karena jumlahnya acak. Contoh (untukchar[]
:[C@4a8e91eb
). Thenext
Metode disalin darijava.util.Random
.Output sampel:
Mari kita menguji efektivitas rng ini:
Dalam jawaban saya untuk Approximate a Bell Curve , pembuatan data yang saya gunakan tergantung pada rng yang baik. Mari kita jalankan dengan ini sebagai rng. Keluaran:
Seperti yang aku pikirkan. Ini sangat buruk.
sumber
C
Kompilasi dengan flag -pthread (atau apa pun yang digunakan kompiler Anda).
Saya tidak yakin apakah ini memenuhi syarat atau tidak berdasarkan pada standar "waktu tidak diizinkan", karena pada dasarnya menggunakan penjadwal sebagai sumber entropi dengan sengaja mengabaikan keselamatan benang. Ia bekerja dengan menggunakan fungsi psuedo-random yang cukup mendasar ( generator bilangan acak Lehmer ) dengan seed awal hard coded. Itu kemudian mulai 20 utas yang semuanya menjalankan perhitungan Lehmer dengan satu set variabel bersama.
Tampaknya bekerja dengan cukup baik, berikut adalah beberapa kali berturut-turut:
EDIT: Beri ini lebih banyak pemikiran dan sadari bahwa ini sama sekali bukan waktu. Bahkan dengan penjadwal yang sepenuhnya deterministik, entropi tidak datang dari irisan waktu - itu berasal dari pemuatan semua proses yang berjalan pada sistem.
EDIT 2 Setelah mengambil beberapa inspirasi dari @ Quincunx memposting kurva lonceng, saya membuang 12 MB keacakan file dan mengunggahnya ke CAcert . Itu gagal semua tes diehard, tetapi mencatat 7.999573 terhormat dari 8 pada tes THT (hanya berpotensi deterministik). Anehnya, menggandakan jumlah utas membuatnya semakin buruk.
sumber
C
Ini menghasilkan angka acak dalam kisaran 0-255 dengan mengambil seed dari https://stackoverflow.com/questions menggunakan
wget
.Contoh dijalankan:
sumber
C ++
keluaran
5 nomor acak
tiga sampel
sumber
11230576, 0, 11206992, 0, 2053725299
, yang masih tidak tampak acak bagi saya.perl
Apa semua sampah ini dengan mendapatkan benih melalui internet? Kedengarannya seperti menipu saya ;-) Saya lebih suka memberikan seed saya ke fungsi hash kriptografis, dan memberikan output dalam kisaran 0 hingga 2 ^ 160-1 seperti:
Kapan pun Anda memiliki entropi dengan kualitas yang tidak pasti, cara untuk mendistribusikannya lebih teratur (tetapi tidak meningkatkan kualitasnya!) Adalah menyalurkannya ke SHA1 atau MD5 atau lebih, seperti yang telah saya lakukan di sini. Untuk benih pra-hash, saya telah menggunakan pid dan alamat referensi acak. Anda tentu saja dapat menambahkan input lain untuk entropi yang lebih banyak, misalnya pada x86 Anda dapat menggunakan TSC - (tetapi inlining kode assembly dalam perl agak sulit, jadi saya melewatkannya).
Jika Anda ingin memiliki output yang berbeda dari yang ada di komputer berikutnya, cukup sesuaikan "some_salt" menjadi string yang Anda sukai. Atau tinggalkan sama sekali jika Anda seorang minimalis =)
sumber
Jawa
Solusi saya menyalahgunakan
hashCode()
metodeObject
kelas.Output sampel:
Termotivasi oleh jawaban lain yang menunjukkan keacakan solusi, saya mengubah solusi saya untuk mengembalikan 16 bit tengah yang
int
dikembalikan olehObject.hashCode()
.Saya menghasilkan file 19 MB (terdiri dari 10 7
short
) dan mengirimkannya ke CACert . Berikut ini adalah screenshot dari hasilnya (telah diedit agar terlihat bagus, tetapi angkanya dibiarkan apa adanya):Saya terkejut dengan hasilnya, karena jam 7.999991 di tes Entropy dan lulus (?) Semua 7 tes Diehard.
sumber
Javascript
Menghasilkan secara acak dengan gerakan mouse pengguna
Lima data terakhir yang disalin:
9637090187003
7828470680762
6045869361238
4220720695015
2422653391073
sumber
Bash, rentang: int antara 0 dan 1
sumber
echo -n & echo $!
akan dilakukan, tetapi menjadi RNG yang sangat buruk. Anda juga dapat mengubah 2 dengan nomor lain, tetapi semakin besar angkanya, semakin buruk "keacakan".Rubi
Sayangnya hanya Mac. Kami menggunakan
sox
untuk menarik byte dari mikrofon (sebagai string, ahem ...), membalikkannya untuk mendapatkan status header di akhir (* batuk *), memotongnya, memotong kepala, mengambil MD5 dari potongan , parit karakter non-numerik dari hash, tambahkan bilangan bulat largish yang tersisa bersama, tempelkan0.
pada bagian depan, konversikan ke float, selesai.Menghasilkan pelampung dengan panjang bervariasi pada interval
0..1
.sumber
C
Menghasilkan secara acak menggunakan ID proses.
Output sampel:
sumber
BERPUTAR
Jika ini kode-golf , saya akan menang!
sumber
ular sanca
Keringkasan Python tidak pernah berhenti memukau. Karena menggunakan gambar acak imgur tampaknya tidak valid, saya telah menggunakan sumber keacakan yang hebat: obrolan stackoverflow!
5 uji coba:
Tidak benar-benar acak tetapi sekali lagi tidak satupun dari ini.
sumber
whatever.com/random
perl
Saya melihat banyak jawaban yang membuat permintaan HTTP, yang tampaknya sia-sia bagi saya karena di bawah selimut ada nomor acak yang diteruskan di kawat. Jadi saya memutuskan untuk menulis beberapa kode untuk menggeseknya di tingkat yang lebih rendah:
Memberikan port acak dalam kisaran 0..65535, secara teoritis. Dalam praktiknya, ada sejumlah port yang tidak akan Anda lihat, sehingga distribusinya jauh dari sempurna. Tapi itu, AFAICT jumlah minimal pekerjaan yang dapat Anda lakukan untuk mendapatkan beberapa entropi dari host jarak jauh yang memiliki port terbuka.
PS - Penanganan kesalahan dibiarkan sebagai latihan untuk pembaca ;-)
sumber
C
sumber