"I" memiliki "i" peluang terjadinya

10

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.

ghosts_in_the_code
sumber
7
Bagaimana dengan peluang 9% lainnya?
LegionMammal978
@ LegionMammal978 saya sudah ditentukan. Ini harus mencetak 0.
ghosts_in_the_code
Ya, tidak apa-apa sekarang. Apa masalahnya sebelumnya?
ghosts_in_the_code
@ghosts_in_the_code The <dari ketidaksetaraan dan >dari blok kutipan membentuk tag HTML.
Martin Ender
2
Apakah resolusi detik oke?
xnor

Jawaban:

13

CJam, 14 byte

E,_T9t\]ze~es=

Uji di sini.

Penjelasan

E,   e# Push [0 1 2 ... 12 13].
_    e# Make a copy.
T9t\ e# Set the first element to 9. Swap with the original range.
]z   e# Wrap them in an array and transpose to get [[9 0] [1 1] [2 2] ... [13 13].
e~   e# Run-length decode to get `[0 0 0 0 0 0 0 0 0 1 2 2 3 3 3 ... 13 13 ... 13 13].
es=  e# Use the current timestamp as a cyclic index into this array.
Martin Ender
sumber
Umm, kenapa tidak mR?
Pengoptimal
1
@ Opptizer "Benih untuk generator harus waktu sistem. Anda tidak dapat menggunakan fungsi yang telah ditentukan untuk pembuatan nomor acak."
Martin Ender
Ah, merindukan bagian itu.
Pengoptimal
7

Python 2, 54

import time
print((time.time()*1e4%800+1)**.5+1)//2%14

Ekspresi f(t) = ((8*t+1)**.5+1)//2mengubah distribusi seragam menjadi distribusi integer segitiga dengan memetakan interval

[0,1)  --> 1
[1,3)  --> 2
[3,6)  --> 3
[6,10) --> 4
...

Kami mengonversi digit milidetik waktu menjadi float seragam dari 0 hingga 100 dengan melakukan time.time()*1e4%100. Sebenarnya, kami lakukan %800untuk mengganti mengalikan dengan 8 pada langkah konversi. Pada akhirnya, 14 dikonversi menjadi 0 dengan melakukan %14.

Tidak
sumber
4

Pyth - 14 byte

@+mZ9smRd14.d8

Hasilkan array dengan distribusi yang ditentukan, lalu pilih yang acak.

Cobalah online di sini .

Maltysen
sumber
4

Dyalog APL , 20 byte

⊃(⌊.1×⊃⌽⎕TS)↓(/⍨⍳13)

⍳13bilangan bulat 1 meskipun 13
(/⍨... )replikasi dengan sendirinya, mis. /⍨3adalah 3 3 3dan /⍨2 3adalah 2 2 3 3 3
n ... drop n elemen (meninggalkan daftar kosong jika n > panjang daftar)
⎕TSstempel 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 kosong

Adm
sumber
3

Memproses 3, 65 55 74 byte

long i=0,c=8,r=System.nanoTime()%100;for(;r>c;i++,c+=i);print(i);

Dapatkan 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!

geokavel
sumber
2

PHP, 50 byte

<?for($t=microtime()*100;0<=$t-=++$i;)?><?=$i%14;
  • microtimemengembalikan 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)
  • Kami kurangi 1, 2, 3, ... dari $thingga mencapai 0
  • Hasilnya adalah angka terakhir yang dikurangi, modulo 14
Fabian Schmengler
sumber
Anda sebenarnya dapat menulis ;echoalih-alih ?><?=, untuk jumlah byte yang sama. Tapi dilakukan dengan baik!
Ismael Miguel
1

Python3, 86 Bytes

lurus ke depan:

import time;print(sum([[i]*i for i in range(1,14)],[0]*9)[int(str(time.time())[-2:])])
ch3ka
sumber
1

J - 28 char

Yang ini konyol.

{:({:1e3*6!:0'')$100{.#~i.14

6!:0''adalah Y M D h m swaktu saat ini sebagai daftar 6-item, di mana milidetik direpresentasikan sebagai fraksi pada detik — untuk mendapatkannya, kita tidak punya pilihan selain melipatgandakan detik ( {:) dengan 1e3. Sementara itu, #~i.14adalah daftar nol 0s, satu 1, dua 2s, dan seterusnya hingga tiga belas 13-an, dan kami menambahkannya ke 100 item dengan 100{..

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

algoritme hiu
sumber
1

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)

R=(s=~new Date,p=[],i=0,j=9)=>{
while(p.push(i)<100)--j?0:j=++i;
return _=>(s=(1+Math.sin(s))*1e5,p[100*(s-~~s)|0])
};

// test

var rnd=R()

t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0];
rgb='000,444,666,888,aaa,ddd,f0f,ff0,0ff,0ff,0f0,00f,f00,fff'.split`,`
.map(v=>(v=parseInt(v,16),[(v&15)*17,(v>>4&15)*17,(v>>8)*17]))

cnt=400*300
//for (i=0;i<cnt;i++)t[rnd()]++;

ctx = C.getContext("2d");
img=ctx.getImageData(0, 0, 400, 300)
for(p=0,y=0;y<300;y++)for(x=0;x<400;x++)
  v=rnd(),t[v]++,
  img.data[p++]=rgb[v][0],img.data[p++]=rgb[v][1],
  img.data[p++]=rgb[v][2],img.data[p++]=255
ctx.putImageData(img, 0, 0)

o=''
for(i=0;i<14;i++)
  t[i]/=cnt, o+=`<p><i>${i}</i><b style="width:${t[i]*300}%">,</b>${(t[i]*100).toFixed(2)}%</p>`;
G.innerHTML=o
#G { width: 400px; font-size: 12px; border: 1px solid #000;  }
p { margin: 0}
b { display: inline-block; font-size:80%; background: #08c; margin: 2px }
i { display: inline-block; width: 20px; text-align: right; padding: 0 4px }
#C { width: 400px; height: 300px; }
<div id=G></div>
<canvas id=C></canvas>

edc65
sumber
Saya sangat suka bagaimana Anda membuktikan bahwa nilai yang dikembalikan sangat dekat dengan persyaratan. Bagus sekali! +10 di atas kanvas itu!
Ismael Miguel
0

TI-BASIC, 18 byte

real(int(.5+2√(-4+50fPart(sub(getTime

100fPart(sub(getTimemendapat 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 hasilnya

Satu-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.

lirtosiast
sumber
0

Perl 5, 51 byte

50 byte + 1 untuk -Ebukannya -e:

@_=(0)x 9;push@_,($_)x$_ for 0..13;say$_[time%100]
msh210
sumber