"I" мають "i" шанс виникнення


10

Створіть генератор випадкових чисел, де i-й номер має 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.
Мартін Ендер

2
Чи добре роздільна здатність секунд?
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.

Гм, чому б і ні mR?
Оптимізатор

1
@Optimizer "Насіння для генератора має бути системним часом. Ви не можете використовувати заздалегідь задану функцію для генерації випадкових чисел."
Мартін Ендер

Ах, пропустив цю частину.
Оптимізатор

7

Пітон 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

Діалог 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 (включно). Якщо число 0-8, надрукуйте 0, якщо це 9 друку 1, якщо 10-11 друк 2, якщо 12-14 друк 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
  • Результат - останнє віднімане число, модуль 14

Ви можете насправді писати ;echoзамість ?><?=того ж числа байтів. Але прекрасно зроблено!
Ісмаїл Мігель

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 char

Цей був дурний.

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

6!:0''- це поточний Y M D h m sчас у вигляді списку з 6 пунктів, де мілісекунди представлені як дроби на секунди - щоб дістатись до них, нам не залишається нічого іншого, як помножити секунди ( {:) на 1e3. Тим часом, #~i.14це список з нуля 0, один 1, два 2 і так далі до тринадцяти 13, і ми додаємо це до 100 предметів 100{..

J не має циклічної індексації, тому може виникнути спокуса взяти модуль 100 мілісекунд, перш ніж індексувати великий список. Тим НЕ менше, ми можемо зберегти два символу, використовуючи $замість цього циклічний розширити список 100-пункту для однак кількості мілісекунд , ми отримуємо (де -то від 0 до 60999 ) і візьміть останній запис тоді.

Мало того, що список елементів 60000 - це ціла маса використаної пам'яті чи чогось іншого, це просто відчуває себе завищеним: P


1

JavaScript (ES6) 116

Це адаптація простої насіннєвої RNG, яку я використав замість стандартної RNG JavaScript, яка не може бути посіяна (і так не повторюється)

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 на цьому полотні!
Ісмаїл Мігель

0

TI-BASIC, 18 байт

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

100fPart(sub(getTimeотримує випадковий залишок між 0 і 99. (n-1) -ве трикутне число дорівнює (N^2+N)/2, тому обернена дорівнює √(2y+1)-.5. Переконайте це після регулювання вниз на 9, і ми отримаємо результат

Єдина проблема полягає в тому, що для залишків менше 8 ми отримуємо уявний квадратний корінь. Таким чином, ми беремо реальну частину, щоб мати натомість програму вихід 0.


0

Perl 5, 51 байт

50 байт + 1 для -Eзамість -e:

@_=(0)x 9;push@_,($_)x$_ for 0..13;say$_[time%100]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.