“我”有“我”发生的机会


10

设计一个随机数生成器,其中第i个数字对于所有0 <i <14都有i%的出现几率。0应该恰好有9%的出现几率。生成器的种子应该是系统时间。您不能将预定义函数用于随机数生成。

基本上1发生的机率是1%,2发生的机率是2%,依此类推,直到13发生的机率是13%。这是代码高尔夫球,因此最短的代码获胜。


7
那另外9%的机会呢?
LegionMammal978

我已经指定了@ LegionMammal978。它应该打印0
ghosts_in_the_code

是的,现在很好。以前是什么问题?
ghosts_in_the_code 2015年

@ghosts_in_the_code <不等式和>引号块组成一个HTML标记。
马丁·恩德

2
几秒钟的分辨率可以吗?
xnor 2015年

Answers:


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呢?
Optimizer

1
@Optimizer“生成器的种子应该是系统时间。您不能使用预定义的函数来生成随机数。”
马丁·恩德

啊,错过了那部分。
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



4

Dyalog APL,20字节

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

⍳13整数1至13
(/⍨)自身复制,例如/⍨3is 3 3 3/⍨2 3is 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而不是写?><?=。但是做得很好!
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是一个0 0,一个1,两个2s,依此类推直到13个13s的列表,我们用填充100个项目100{.

J没有循环索引,因此在对大列表进行索引之前,可能会以毫秒为单位取100为模。但是,我们可以通过使用$循环地将 100项列表扩展到我们获得的毫秒数(从0到60999之间的任何位置)来保存两个字符),然后获取最后一个条目。

并不是说60000个元素列表占用了太多的内存或任何东西,只是感觉像是过分的:P


1

JavaScript(ES6)116

这是我使用的简单种子RNG 的改编版本,而不是无法播种的javascript的标准RNG(因此不可重复)

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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.