Desain generator angka acak di mana angka ke-i memiliki peluang% untuk terjadi untuk semua 0 <i <14. 0 harus memiliki peluang persis 9% untuk terjadi. Benih untuk generator harus waktu sistem. Anda tidak dapat menggunakan fungsi yang telah ditentukan untuk pembuatan angka acak.
Pada dasarnya 1 memiliki 1% peluang terjadi, 2 memiliki 2% peluang dan seterusnya hingga 13 memiliki 13% peluang terjadi. Ini kode-golf, jadi kode terpendek menang.
code-golf
math
random
probability-theory
ghosts_in_the_code
sumber
sumber
<
dari ketidaksetaraan dan>
dari blok kutipan membentuk tag HTML.Jawaban:
CJam, 14 byte
Uji di sini.
Penjelasan
sumber
mR
?Python 2, 54
Ekspresi
f(t) = ((8*t+1)**.5+1)//2
mengubah distribusi seragam menjadi distribusi integer segitiga dengan memetakan intervalKami mengonversi digit milidetik waktu menjadi float seragam dari 0 hingga 100 dengan melakukan
time.time()*1e4%100
. Sebenarnya, kami lakukan%800
untuk mengganti mengalikan dengan 8 pada langkah konversi. Pada akhirnya, 14 dikonversi menjadi 0 dengan melakukan%14
.sumber
Pyth - 14 byte
Hasilkan array dengan distribusi yang ditentukan, lalu pilih yang acak.
Cobalah online di sini .
sumber
Dyalog APL , 20 byte
⍳13
bilangan bulat 1 meskipun 13(/⍨
...)
replikasi dengan sendirinya, mis./⍨3
adalah3 3 3
dan/⍨2 3
adalah2 2 3 3 3
n
↓
... drop n elemen (meninggalkan daftar kosong jika n > panjang daftar)⎕TS
stempel waktu sistem mis. 2015 11 1 13 28 56 834⊃⌽
elemen terakhir, yaitu milidetik saat ini 0–999⌊.1×
kalikan dengan 0,1 dan bulatkan⊃
elemen pertama, memberikan 0 jika data kosongsumber
Memproses 3, 65
5574byteDapatkan nomor acak dari 0 hingga 99 (inklusif). Jika angka 0-8, cetak 0, jika 9 cetak 1, jika 10-11 cetak 2, jika 12-14 cetak 3, dll ...
Tidak ada yang menyadarinya, tetapi masalah dengan kode lama adalah millis () mengembalikan jumlah waktu aplikasi telah berjalan, yang akan memberikan angka yang sangat mirip pada program berikutnya. Setidaknya sekarang kita memiliki ketepatan nano!
sumber
PHP, 50 byte
microtime
mengembalikan waktu sebagai string seperti "0,04993000 1446409253", ketika saya kalikan ini dengan 100, PHP memaksa string menjadi 0,04993000, menghasilkan 4,993000. Begitu$t
diinisialisasi dengan angka "acak" di[0,100)
$t
hingga mencapai 0sumber
;echo
alih-alih?><?=
, untuk jumlah byte yang sama. Tapi dilakukan dengan baik!Python3, 86 Bytes
lurus ke depan:
sumber
J - 28 char
Yang ini konyol.
6!:0''
adalahY M D h m s
waktu saat ini sebagai daftar 6-item, di mana milidetik direpresentasikan sebagai fraksi pada detik — untuk mendapatkannya, kita tidak punya pilihan selain melipatgandakan detik ({:
) dengan1e3
. Sementara itu,#~i.14
adalah daftar nol 0s, satu 1, dua 2s, dan seterusnya hingga tiga belas 13-an, dan kami menambahkannya ke 100 item dengan100{.
.J tidak memiliki pengindeksan siklik, jadi mungkin tergoda untuk mengambil milidetik modulo 100 sebelum mengindeks daftar besar. Namun, kita dapat menyimpan dua karakter dengan menggunakan
$
untuk secara siklik memperpanjang daftar 100-item ke berapa banyak milidetik yang kita dapatkan (di mana saja dari 0 hingga 60999 ) dan mengambil entri terakhir lalu.Bukan berarti daftar elemen 60000 adalah seluruh banyak memori yang digunakan atau apa pun, itu hanya terasa seperti berlebihan: P
sumber
JavaScript (ES6) 116
Ini adalah adaptasi dari RNG sederhana yang diunggah yang telah saya gunakan alih-alih RNG standar javascript yang tidak dapat diunggulkan (dan karena itu bukan pengulangan)
sumber
TI-BASIC, 18 byte
100fPart(sub(getTime
mendapat residu acak antara 0 dan 99. Angka segitiga (n-1) sama dengan(N^2+N)/2
, jadi kebalikannya sama dengan√(2y+1)-.5
. Lantai ini setelah disesuaikan ke bawah oleh 9, dan kami mendapatkan hasilnyaSatu-satunya masalah adalah bahwa untuk residu kurang dari 8, kita mendapatkan akar kuadrat imajiner. Jadi kita mengambil bagian yang sebenarnya untuk memiliki output program 0 sebagai gantinya.
sumber
Perl 5, 51 byte
50 byte + 1 untuk
-E
bukannya-e
:sumber