「i」には「i」の可能性がある


10

すべての0 <i <14について、i番目の数がi%の確率で発生する乱数ジェネレーターを設計します。0は正確に9%の確率で発生します。ジェネレーターのシードはシステム時間である必要があります。事前定義された関数を乱数生成に使用することはできません。

基本的に、1は1%の確率で発生し、2は2%の確率で発生し、13までは13%の確率で発生します。これはコードゴルフなので、最短のコードが優先されます。


7
他の9%の確率はどうですか?
LegionMammal978 2015年

@ LegionMammal978すでに指定しました。これは、0印刷する必要があります
ghosts_in_the_code

はい、大丈夫です。以前の問題は何でしたか?
ghosts_in_the_code 2015年

@ghosts_in_the_code <from不等式と>from引用ブロックがHTMLタグを形成していました。
マーティンエンダー2015年

2
秒の分解能で大丈夫ですか?
xnor 2015年

回答:


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
オプティマイザ、2015年

1
@Optimizer "ジェネレータのシードはシステム時間である必要があります。乱数の生成に事前定義された関数を使用することはできません。"
マーティンエンダー2015年

ああ、その部分を逃した。
オプティマイザ

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
nn要素を削除します(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)
  • $t0になるまで1、2、3、...を減算します
  • 結果は、最後に減算された数値、モジュロ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.140は0、1は1、2は2、以下同様に13の13までのリストであり、100アイテムまでで埋めます100{.

Jには循環インデックスがないので、大きなリストにインデックスを付ける前に100を法とするミリ秒をかけたくなるかもしれません。ただし、$代わりにを使用して100アイテムのリストを周期的に拡張し、取得したミリ秒(0から60999まで)に2文字を保存して、最後のエントリを取得できます。

60000の要素リストは、使用されているメモリの総量などではなく、単にやり過ぎのように感じます:P


1

JavaScript(ES6)116

これは、シードできないjavascriptの標準RNGの代わりに使用した単純なシード済み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!
Ismael Miguel

0

TI-BASIC、18バイト

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

100fPart(sub(getTime0から99の間のランダムな剰余を取得します。(n-1)番目の三角形の数値はに等しい(N^2+N)/2ため、逆数はに等しくなり√(2y+1)-.5ます。下に9を調整した後、これをフロアしてください。

唯一の問題は、8未満の剰余の場合、虚数の平方根が得られることです。そのため、プログラムの出力を0にする代わりに実際の部分を使用します。


0

Perl 5、51バイト

-E代わりに50バイト+ 1 -e

@_=(0)x 9;push@_,($_)x$_ for 0..13;say$_[time%100]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.