Cơ hội của tôi có thể xảy ra


10

Thiết kế một trình tạo số ngẫu nhiên trong đó số thứ i có i% cơ hội xảy ra cho tất cả 0 <i <14. 0 nên có chính xác 9% cơ hội xảy ra. Hạt giống cho máy phát điện phải là thời gian hệ thống. Bạn không thể sử dụng hàm được xác định trước để tạo số ngẫu nhiên.

Về cơ bản 1 có 1% cơ hội xảy ra, 2 có 2% cơ hội và cứ như vậy có tới 13% cơ hội xảy ra. Đây là môn đánh gôn, vì vậy đoạn mã ngắn nhất sẽ thắng.


7
9% cơ hội còn lại thì sao?
LegionMammal978

@ LegionMammal978 Tôi đã chỉ định. Nó sẽ in 0.
ghosts_in_the_code

Vâng, giờ thì ổn rồi. Vấn đề trước đó là gì?
ghosts_in_the_code

@ghosts_in_the_code <Từ bất đẳng thức và >từ khối trích dẫn đã tạo thành một thẻ HTML.
Martin Ender

2
Độ phân giải của giây có ổn không?
xnor

Câu trả lời:


13

CJam, 14 byte

E,_T9t\]ze~es=

Kiểm tra nó ở đây.

Giải trình

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.

Umm, tại sao không mR?
Tối ưu hóa

1
@Optimizer "Hạt giống cho trình tạo phải là thời gian hệ thống. Bạn không thể sử dụng hàm được xác định trước để tạo số ngẫu nhiên."
Martin Ender

Ah, đã bỏ lỡ phần đó.
Tối ưu hóa

7

Con trăn 2, 54

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

Biểu thức f(t) = ((8*t+1)**.5+1)//2biến đổi phân phối đồng đều thành phân phối số nguyên tam giác bằng cách ánh xạ các khoảng

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

Chúng tôi chuyển đổi các chữ số mili giây của thời gian thành một số float thống nhất từ ​​0 đến 100 bằng cách thực hiện time.time()*1e4%100. Trên thực tế, chúng tôi làm %800để thay thế nhân với 8 trong bước chuyển đổi. Cuối cùng, 14 giây được chuyển đổi thành 0 bằng cách thực hiện %14.



4

APL Dyalog , 20 byte

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

⍳13số nguyên 1 mặc dù 13
(/⍨... )lặp lại bởi chính nó, ví dụ như /⍨33 3 3/⍨2 32 2 3 3 3
n ... thả n yếu tố (lá danh sách trống nếu n > chiều dài của danh sách)
⎕TSthời gian hệ thống tem ví dụ như 2015 11 1 13 28 56 834
⊃⌽yếu tố cuối cùng, tức là hiện nay phần nghìn giây 0-999
⌊.1×nhân với 0,1 và làm tròn
phần tử đầu tiên, cho 0 nếu dữ liệu trống


3

Xử lý 3, 65 55 74 byte

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

Nhận một số ngẫu nhiên từ 0 đến 99 (đã bao gồm). Nếu số là 0-8, in 0, nếu là 9 in 1, nếu 10-11 in 2, nếu 12-14 in 3, v.v ...

Không ai chú ý đến nó, nhưng vấn đề với mã cũ là millis () trả về lượng thời gian mà ứng dụng đã chạy, nó sẽ đưa ra những con số rất giống nhau trong các lần chạy tiếp theo của chương trình. Ít nhất bây giờ chúng tôi có độ chính xác nano!


2

PHP, 50 byte

<?for($t=microtime()*100;0<=$t-=++$i;)?><?=$i%14;
  • microtimetrả về thời gian dưới dạng một chuỗi như "0,04993000 1446409253", khi tôi nhân số này với 100, PHP đã ép chuỗi thành 0,04993000, kết quả 4,993000. Vì vậy, $tđược khởi tạo với một số "ngẫu nhiên" trong[0,100)
  • Chúng tôi trừ 1, 2, 3, ... từ $tkhi nó đạt 0
  • Kết quả là số bị trừ cuối cùng, modulo 14

Bạn thực sự có thể viết ;echothay vì ?><?=, cho cùng một số byte. Nhưng được thực hiện độc đáo!
Ismael Miguel

1

Python3, 86 byte

thẳng về phía trước:

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

1

J - 28 char

Điều này là ngớ ngẩn.

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

6!:0''Y M D h m sthời gian hiện tại dưới dạng danh sách 6 mục, trong đó mili giây được biểu thị dưới dạng phân số trên giây, để có được chúng, chúng ta không có lựa chọn nào khác ngoài nhân số giây ( {:) với 1e3. Trong khi đó, #~i.14là một danh sách gồm 0 số 0, một 1, 2 2, và cứ như vậy cho đến mười ba 13, và chúng tôi đưa ra tới 100 mục 100{..

J không có lập chỉ mục theo chu kỳ, do đó, có thể nên dùng modulo 100 mili giây trước khi lập chỉ mục cho danh sách lớn. Tuy nhiên, chúng ta có thể lưu hai ký tự bằng cách sử dụng $để thay vào đó mở rộng danh sách 100 mục thành tuy nhiên nhiều mili giây chúng ta nhận được (bất cứ nơi nào từ 0 đến 60999 ) và thực hiện mục nhập cuối cùng sau đó.

Không phải là danh sách 60000 phần tử là toàn bộ bộ nhớ được sử dụng hoặc bất cứ thứ gì, nó chỉ cảm thấy như quá mức cần thiết: P


1

JavaScript (ES6) 116

Đây là bản chuyển thể của RNG được tạo hạt đơn giản mà tôi đã sử dụng thay vì RNG tiêu chuẩn của javascript không thể được tạo mầm (và do đó không phải là lặp lại)

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>


Tôi thực sự thích cách bạn chứng minh rằng giá trị trả về thực sự gần với yêu cầu. Làm tốt lắm! +10 trên tấm vải đó!
Ismael Miguel

0

TI-BASIC, 18 byte

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

100fPart(sub(getTimeđược dư lượng ngẫu nhiên trong khoảng từ 0 đến 99. Số tam giác thứ (n-1) bằng (N^2+N)/2, do đó nghịch đảo bằng √(2y+1)-.5. Tầng này sau khi điều chỉnh xuống 9, và chúng tôi có kết quả

Vấn đề duy nhất là đối với dư lượng nhỏ hơn 8, chúng ta có được một căn bậc hai tưởng tượng. Vì vậy, chúng tôi lấy phần thực để có đầu ra chương trình 0 thay thế.


0

Perl 5, 51 byte

50 byte + 1 -Ethay vì -e:

@_=(0)x 9;push@_,($_)x$_ for 0..13;say$_[time%100]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.