У "я" есть шанс "я"

10

Разработайте генератор случайных чисел, в котором i-е число имеет i% -ную вероятность появления для всех 0 <i <14. 0 должно иметь точно 9% -ную вероятность появления. Семя для генератора должно быть системным временем. Вы не можете использовать предопределенную функцию для генерации случайных чисел.

В основном 1 имеет вероятность 1%, 2 имеет вероятность 2% и т. Д. До 13 с вероятностью 13%. Это код-гольф, поэтому выигрывает самый короткий код.

ghosts_in_the_code
источник
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

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.

XNOR
источник
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 (включительно). Если число 0-8, выведите 0, если это 9, напечатайте 1, если 10-11 напечатайте 2, если 12-14 напечатайте 3 и т. Д.

Никто не заметил этого, но проблема со старым кодом заключается в том, что millis () возвращает количество времени, в течение которого приложение работало, что даст очень похожие цифры при последующих запусках программы. По крайней мере, теперь у нас есть нано точность!

geokavel
источник
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:])])
ch3ka
источник
1

J - 28 символов

Этот был глупым.

{:({: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

algorithmshark
источник
1

JavaScript (ES6) 116

Это адаптация простого засеянного ГСЧ, который я использовал вместо стандартного ГСЧ из 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>

edc65
источник
Мне очень нравится, как вы доказываете, что возвращаемое значение действительно близко к требованиям. Красиво сделано! +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.

lirtosiast
источник
0

Perl 5, 51 байт

50 байтов + 1 -Eвместо -e:

@_=(0)x 9;push@_,($_)x$_ for 0..13;say$_[time%100]
msh210
источник