Sangat mudah untuk menghasilkan koin yang adil menggunakan koin yang tidak adil, tetapi sebaliknya lebih sulit untuk dicapai.
Program Anda akan menerima satu angka X (antara 0 dan 1, inklusif) sebagai input. Input tidak boleh hanya berupa hard-kode sebagai angka di tengah kode sumber. Kemudian harus mengembalikan satu digit: a 1
dengan probabilitas X dan 0
sebaliknya.
Program Anda hanya diperbolehkan menggunakan satu bentuk generator angka acak dalam kode sumber: int(rand(2))
(atau yang setara), yang mengembalikan nol atau yang memiliki probabilitas yang sama. Anda dapat memasukkan atau mengakses fungsi ini sebanyak yang Anda inginkan dalam kode Anda. Anda juga harus menyediakan fungsi sendiri sebagai bagian dari kode.
Program Anda tidak diperbolehkan menggunakan fungsi penghasil nomor acak atau sumber eksternal lainnya (seperti fungsi waktu dan tanggal) yang dapat berfungsi sebagai fungsi penghasil nomor acak. Itu juga tidak dapat mengakses file eksternal atau meneruskan pekerjaan ke program eksternal.
Ini kode golf, jawaban terpendek menang.
Jawaban:
Perl, 37
42charMembawa probabilitas arbitrer sebagai argumen baris perintah. Membuat nomor acak yang seragam
$d
dan membandingkannya dengan input.Sebelumnya, 52 solusi char
sumber
Python, 81 karakter
Dapat dimatikan sedikit, tetapi tidak pernah lebih dari 1%.
sumber
random.random() < desiredProbability
menggunakan skrip ini: gist.github.com/3656877 Mereka cocok dengan sempurna i.imgur.com/Hr8uE.pngrandom.random() < x
jauh lebih cepat.Mathematica 165
Tidak disederhanakan, tetapi beberapa mungkin menemukan algoritma yang menarik:
Pemakaian
Memeriksa
Mari kita lihat apakah
f[.53]
benar-benar menghasilkan nilai1
sekitar 53% dari waktu. Setiap tes menghitung% untuk sampel 10 ^ 4.50 tes semacam itu dijalankan dan dirata-rata.
Histogram hasil
Penjelasan (peringatan spoiler!)
Representasi basis 2 dari .53 adalah
Melanjutkan dari kiri ke kanan, satu digit pada satu waktu:
Jika RandomInteger [] mengembalikan 1, maka jawab = 1,
Lain Jika RandomInteger kedua [] mengembalikan 0, maka jawab = 0,
Lain Jika RandomInteger ketiga [] mengembalikan 0, jawabannya = 0,
Lain....
Jika, ketika semua digit telah diuji, masih belum ada jawaban, maka jawab = RandomInteger [].
sumber
Haskell, 107 karakter:
sumber
Bahasa Wolfram (Mathematica) , 42 byte
Cobalah online!
Ini adalah pendekatan rekursif. Tidak digabungkan, algoritmenya adalah:
p
kurang dari 1/2, maka ketika coinflip muncul 0, kembalikan 0. Jika tidak, kambuh kembali2p
; dengan asumsi benar, probabilitas keseluruhan untuk mendapatkan 1 adalah setengah2p
ataup
.p
lebih besar dari 1/2, maka ketika coinflip muncul 1, kembalikan 1. Jika tidak, muncul kembali2p-1
; dengan asumsi benar, probabilitas keseluruhan untuk mendapatkan 0 adalah setengah1-(2p-1)
atau1-p
.Untuk membuatnya lebih pendek, kita mulai dengan coinflip acak, yang, di cabang mana pun, dikembalikan separuh waktu. Jika coinflip tidak cocok dengan case ketika kita seharusnya mengembalikannya, ganti dengan hasil pengulangan pada
2p
modulo 1. (Yaitu, ketikap
kurang dari 1/2, ganti 1; ketikap
lebih besar dari 1/2 , ganti 0. Ini sama dengan mengganti⌈1-2p⌉
.)sumber