“ i” มี“ i” โอกาสที่จะเกิดขึ้น


10

ออกแบบตัวสร้างตัวเลขสุ่มโดยที่ตัวเลข i th นั้นมีโอกาส i% ที่จะเกิดขึ้นสำหรับ 0 <i <14. 0 ทั้งหมดควรมีโอกาสที่จะเกิดขึ้น 9% เมล็ดสำหรับเครื่องกำเนิดไฟฟ้าควรเป็นเวลาของระบบ คุณไม่สามารถใช้ฟังก์ชั่นที่กำหนดไว้ล่วงหน้าสำหรับการสร้างตัวเลขสุ่ม

โดยทั่วไป 1 มีโอกาสเกิดขึ้น 1% 2 มีโอกาส 2% และสูงถึง 13 มีโอกาสเกิดขึ้น 13% นี่คือรหัสกอล์ฟดังนั้นรหัสที่สั้นที่สุดชนะ


7
โอกาสอื่นอีก 9% มีอะไรบ้าง
LegionMammal978

@ LegionMammal978 ฉันได้ระบุไปแล้ว ควรพิมพ์ 0
ghosts_in_the_code

ใช่มันไม่เป็นไร ปัญหาก่อนหน้านี้คืออะไร?
ghosts_in_the_code

@ghosts_in_the_code <จากความไม่เท่าเทียมกันและ>จากบล็อกคำพูดกำลังก่อตัวแท็ก HTML
Martin Ender

2
ความละเอียดของวินาทีเป็น OK หรือไม่?
xnor

คำตอบ:


13

CJam, 14 ไบต์

E,_T9t\]ze~es=

ทดสอบที่นี่

คำอธิบาย

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.


1
@Optimizer "seed สำหรับตัวสร้างควรเป็นเวลาของระบบคุณไม่สามารถใช้ฟังก์ชันที่กำหนดไว้ล่วงหน้าสำหรับการสร้างหมายเลขแบบสุ่ม"
Martin Ender

อ๊ะพลาดส่วนนั้นไป
เครื่องมือเพิ่มประสิทธิภาพ

7

Python 2, 54

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

นิพจน์f(t) = ((8*t+1)**.5+1)//2แปลงการแจกแจงแบบสม่ำเสมอเป็นการแจกแจงเลขจำนวนเต็มรูปสามเหลี่ยมโดยการจับคู่ช่วงเวลา

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

เราแปลงตัวเลขมิลลิวินาทีของเวลาที่จะลอยเครื่องแบบ 0-100 time.time()*1e4%100โดยการทำ ที่จริงแล้วเราทำ%800เพื่อแทนที่การคูณด้วย 8 ในขั้นตอนการแปลง ในตอนท้ายของ 14 จะถูกแปลงเป็น 0 %14โดยการทำ


4

Pyth - 14 ไบต์

@+mZ9smRd14.d8

สร้างอาร์เรย์ด้วยการแจกแจงที่ระบุจากนั้นเลือกสุ่ม

ลองมันออนไลน์ได้ที่นี่


4

Dyalog APLขนาด 20 ไบต์

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

⍳13จำนวนเต็ม 1 แม้ว่า 13
(/⍨... )ซ้ำด้วยตัวเองเช่น/⍨3เป็น3 3 3และ/⍨2 3เป็น2 2 3 3 3
n ... หล่นnองค์ประกอบ (ใบรายการที่ว่างเปล่าถ้าn > ยาวของรายการ)
⎕TSแสตมป์เวลาของระบบเช่น 2015 11 1 13 28 56 834
⊃⌽องค์ประกอบสุดท้ายคือมิลลิวินาทีปัจจุบัน 0-999
⌊.1×คูณ ด้วย 0.1 และปัดเศษ
องค์ประกอบแรกลงมาจะให้ 0 ถ้าข้อมูลว่างเปล่า


3

กำลังดำเนินการ 3, 65 55 74ไบต์

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

รับตัวเลขสุ่มจาก 0 ถึง 99 (รวม) ถ้า number เป็น 0-8 ให้พิมพ์ 0 ถ้าเป็น 9 print 1 ถ้า 10-11 print 2 ถ้า 12-14 print 3 ฯลฯ

ไม่มีใครสังเกตเห็น แต่ปัญหาเกี่ยวกับรหัสเก่าคือ millis () จะคืนค่าจำนวนเวลาที่แอปพลิเคชันทำงานซึ่งจะให้ตัวเลขที่คล้ายกันมากกับการรันโปรแกรมในครั้งต่อไป อย่างน้อยตอนนี้เรามีความแม่นยำระดับนาโน!


2

PHP, 50 ไบต์

<?for($t=microtime()*100;0<=$t-=++$i;)?><?=$i%14;
  • microtimeส่งคืนเวลาเป็นสตริงเช่น "0.04993000 1446409253" เมื่อฉันคูณนี่ด้วย 100 PHP จะรวมสตริงเข้ากับ 0.04993000 ผลลัพธ์ 4.993000 ดังนั้น$tจะเริ่มต้นด้วยหมายเลข "สุ่ม" ใน[0,100)
  • เราลบ 1, 2, 3, ... จาก$tจนกว่าจะถึง 0
  • ผลลัพธ์คือจำนวนลบล่าสุด, modulo 14

คุณสามารถเขียน;echoแทน?><?=จำนวนไบต์เดียวกันได้ แต่ทำได้ดีมาก!
Ismael Miguel

1

Python3, 86 ไบต์

ตรงไปข้างหน้า:

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

1

J - 28 ตัวอักษร

อันนี้โง่

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

6!:0''ปัจจุบันY M D h m sเวลาเป็นรายการที่ 6 รายการที่มิลลิวินาทีจะแสดงเป็นเศษส่วนในไม่กี่วินาทีที่จะได้รับพวกเขาเราต้อง แต่ไม่มีทางเลือกที่จะคูณวินาที ( {:) 1e3โดย ในขณะเดียวกัน#~i.14คือรายการของศูนย์ 0s หนึ่ง 1 สอง 2s และอื่น ๆ ผ่านไปสิบสาม 13s และเราแผ่นที่ออกไป 100 100{.รายการที่มี

J ไม่มีการจัดทำดัชนีแบบวนรอบดังนั้นมันอาจเป็นการล่อลวงให้ใช้ค่าโมดูโล 100 มิลลิวินาทีก่อนที่จะจัดทำดัชนีรายการใหญ่ อย่างไรก็ตามเราสามารถบันทึกอักขระสองตัวโดยใช้$เพื่อขยายรายการ 100 รายการไปเป็นมิลลิวินาทีอย่างไรก็ตามเราได้รับหลาย ๆ มิลลิวินาที (ที่ใดก็ได้จาก 0 ถึง60999 ) และใช้รายการสุดท้ายจากนั้น

ไม่ว่ารายการองค์ประกอบ 60000 เป็นจำนวนหน่วยความจำที่ใช้ทั้งหมดหรืออะไรก็ตามมันให้ความรู้สึกเหมือน overkill: P


1

JavaScript (ES6) 116

นี่คือการปรับตัวของRNG แบบ seeded อย่างง่ายที่ฉันได้ใช้แทนที่จะเป็น RNG มาตรฐานของ javascript ที่ไม่สามารถ seeded ได้ (ดังนั้นจึงไม่สามารถยกเลิกได้)

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>


ฉันชอบวิธีที่คุณพิสูจน์ว่ามูลค่าที่ส่งคืนนั้นใกล้เคียงกับข้อกำหนดจริงๆ ทำได้ดีมาก! +10 บนผืนผ้าใบนั้น!
Ismael Miguel

0

TI-BASIC, 18 ไบต์

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

100fPart(sub(getTimeได้รับสารตกค้างสุ่มระหว่าง 0 และ 99 (n-1) TH จำนวนสามเหลี่ยมเท่ากับดังนั้นผกผันมีค่าเท่ากับ(N^2+N)/2 √(2y+1)-.5ชั้นนี้หลังจากปรับลดลง 9 และเรามีผล

ปัญหาเดียวก็คือสำหรับสิ่งตกค้างน้อยกว่า 8 เราจะได้สแควร์รูทในจินตนาการ ดังนั้นเราจึงใช้ส่วนจริงเพื่อให้ผลลัพธ์ของโปรแกรม 0 แทน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.