pengantar
Anda diberi generator integer acak dengan implementasi berikut
- Doa pertama selalu mengembalikan 1.
- Doa kedua mengembalikan integer acak antara 1 dan 2.
- Doa ketiga mengembalikan integer acak antara 1 dan 3.
- Doa n mengembalikan integer acak antara 1 dan n, inklusif.
Berdasarkan fungsi di atas, tulis generator dadu acak yang sangat acak, mengembalikan nilai antara 1 dan 6 (inklusif) dengan probabilitas yang sama.
Aturan
- Program / fungsi Anda harus menghasilkan bilangan bulat acak antara 1 dan 6, inklusif, dalam beberapa bentuk yang dapat digunakan, yaitu, untuk output standar atau sebagai nilai pengembalian fungsi.
- Generator angka acak yang naik di atas dapat didefinisikan sebagai fungsi "bebas" dalam program Anda (yaitu, tidak dihitung terhadap jumlah karakter Anda), atau skrip / program terpisah yang dijalankan sesuai kebutuhan, dengan asumsi state (
n
) persisten antar panggilan. - Asumsikan bahwa tidak lebih dari 1000 gulungan dadu akan diminta dalam satu kasus penggunaan program Anda, dan generator nomor acak awal dapat diatur ulang
1
pada akhir 1000 gulungan dadu untuk menghindari kelebihann
. - Program Anda mungkin tidak menggunakan salah sumber lain dari angka acak kecuali acak naik didefinisikan di atas. Anda tentu saja dapat meminta beberapa nomor acak dari generator nomor acak untuk setiap output gulungan dadu tunggal.
- Ini adalah kode-golf, jadi pemenang adalah jawaban terpendek atau suara terbanyak dalam hal seri. Jika Anda dapat menghasilkan 1.000 dadu gulungan menggunakan kurang dari 1000 angka acak yang dihasilkan, beri diri Anda bonus efisiensi 10 poin .
Contoh
./asc-rand
1 # random integer between 1 and 1
./asc-rand
1 # random integer between 1 and 2
./asc-rand
3 # random integer between 1 and 3
./asc-rand
4 # random integer between 1 and 4
# dice-gen generates random dice based on output of asc-rand program.
./dice-gen
3
./dice-gen
6
./dice-gen
5
./dice-gen
1
iterate(6):b=asc-rand(); print b
ilegal atau tidak berfungsi? Saya mungkin salah mengerti aturan ketiga.Jawaban:
J - 13 char
Ini membuat asumsi yang sama dengan Golfscript: bahwa jumlah dadu ada di stdin dan kami daftar gulungan dadu yang akan keluar.
Dijelaskan oleh ledakan:
Jika itu entah bagaimana tidak memuaskan, ini adalah program 21-char yang lebih panjang, yang dapat dipanggil dengan
f''
untuk menghasilkan angka acak, menampilkan keadaan dan segalanya.sumber
r:{*1_draw x}
, versi stdin (10 char)r'1+!. 0:`
, versi fungsi (14 char)c:0;f:{r@c+:1}
dipanggil olehf[]
.Python, 31 karakter
Demikian pula untuk scleaver, tentukan generator seperti ini:
Kemudian fungsi untuk mengembalikan gulungan dadu:
Panggil
D()
kapan saja Anda membutuhkan gulungan dadu acak yang seragam.sumber
Scala 23
Metode r dapat (kurang-lebih) diimplementasikan seperti ini:
tes kasar:
Setiap panggilan ke-6 harus menghasilkan distribusi yang sama di atas nilai-nilai 6, jadi saya membuang 5.
sumber
GolfScript (15 karakter)
Ini mengasumsikan bahwa jumlah gulungan yang diperlukan disediakan pada stdin dan daftar yang banyak hasilnya harus stdout.
Demo online
Sementara saya bisa mendapatkan bonus 10 poin karena menggunakan kurang dari 1000 gulungan untuk menghasilkan 1000 angka, saya akan dikenakan biaya lebih dari 10 karakter. Pendekatan sepele dari mengekstraksi entropi yang sesuai ketika N adalah kelipatan dari kekuatan 2 atau 3 gagal karena jumlah hasil yang tersedia mod 3 hanya 333 + 111 + 37 + 12 + 4 + 1 = 498. Oleh karena itu perlu untuk mengambil pendekatan sampel-dan-tolak. Dengan menggunakan pendekatan ini Anda bisa mendapatkan 2242 gulungan yang diharapkan dari 1.000 panggilan
r
, tetapi ada biaya tambahan dari pembukuan danbase
merupakan nama fungsi yang sangat panjang.sumber
base
nama fungsi yang sangat panjang" Anda tampaknya tidak menggunakan Mathematica . Kami mendapatkan keajaiban sepertiNegativeBinomialDistribution
,ExponentialGeneratingFunction
,MathieuCharacteristicExponent
,InverseFourierSequenceTransform
, danSemialgebraicComponentInstances
. :-)Python
6563Fungsinya
R()
adalah randomizer ascending.Pemakaian:
sumber
for
loop Anda dan panggilR
sekali saja sebelumwhile
loop Anda ?R()
sedang mengembalikan float dan Anda meraih angka paling tidak signifikan. Sekarang telah diklarifikasi yangR()
mengembalikan integer, masuk akal.Python, 56
r didefinisikan sebagai:
generator dadu:
penggunaan, misalnya, untuk 100 gulungan:
sumber
import math
jika Anda gantimath.ceil(...)
denganint(...)+1
Mathematica 51
Generator angka acak
r
,, diatur ulang dengan mengatur variabel global,n
ke 1.Kode
Tidak dalam menjalankan kode terpendek ...
Pemakaian
60000 gulungan dadu diperlukan 60031 panggilan ke
h
.Tally
menunjukkan rincian dengan angka 1-6.sumber
Perl, 22 atau 45
Implementasi generator nomor acak yang naik:
Menghasilkan:
Menguji:
sumber
JavaScript (Node.js) , 35 byte
Cobalah online!
sumber
opcode x86, 15 byte
sumber
GolfScript , 8 byte
Cobalah online!
Ini muncul generator sekali, kemudian singkirkan hasilnya. Kemudian ia menggulung f2, dan mengalikannya dengan 3 (3 atau 6), lalu kurangi f3-1 (0, 1, 2) yang menghasilkan (3-2, 3-1, 3-0) atau (6-2, 6-1, 6-0) W5.
Golfscript dan fungsi acak ada sebelum pertanyaan ini diposting, begitu juga pengiriman yang sah.
Ini adalah pengajuan run-only-once. Jika Anda perlu menjalankannya beberapa kali dalam satu panggilan,
GolfScript , 12 byte
Cobalah online!
Ini me-reset panggilan saya ke 0 sehingga me-reset sesuai. TIO ini menunjukkan 50 hasil acak.
sumber
C (gcc) , 31 byte
Setiap 6 panggilan, probabilitas setiap angka antara 1 dan 6 inklusif yang dihasilkan adalah sama.
c
adalah#define
d sebagai panggilan ke fungsi yang menghasilkan angka acak sempurna.Cobalah online!
sumber