2017-03-27 15 views

答えて

2

u()=uniform(1,10)を聞かせて、あなたが均一な機能の3回の呼び出しを必要とする、あなたの新しいランダム変数 `

v() = 10*(u()-1) + u() + 100*I[u()>5] 

ノートを書くことができ、3つ目はいえブール変数することができます。ここで私はインジケータ機能

I[x] = x ? 1 : 0  // if x is true then 1 else 0. 

代わりのu()>5として使用するには、同等(uが偶数である)u()%2==0を定義することができます。 3つ目の値がバイナリ値としてのみ使用されているにもかかわらず、10 * 10 * 2という200の別個の値を作成すると考えることができます。

ここ和又は最大値のいずれかが適合値として使用することができ、最後の列は、理想的な分布の違いを示しawk実装ヒストグラム試験

awk 'function u() {return int(1+rand()*10)} 
     BEGIN {srand(); trials=100000; 
      for(i=1;i<=trials;i++) v[10*(u()-1)+u()+100*(u()%2)]++; 
      for(k in v) print k, v[k], (v[k]-trials/200)^2}' | sort -k3nr 

あります。より洗練された分析のために、より複雑なテスト、カイ2乗などがあります。

1

基本関数を3回呼び出し、結果をスケールします。

int rand1to200() { 
    return ((rand1to10() - 1)*100 + 
    (rand1to10() - 1)*10 + 
    (rand1to10() - 1)*1)%200 + 1; 
} 
+0

OPの質問にお答えできませんでした。あなたの答えは、 '10^n'が' 200'で割り切れる正の整数 'n'(ここでは' n == 3')がある場合にこの特殊なケースで動作します。しかし、質問に「1から173までの乱数」と表示された場合はどうでしょうか?あなたの忠誠心は1から173までのすべての数字に均等に確率を与えます。 – user7771338

+0

@FREE_AND_OPEN_SOURCE OPの狭い質問に答えます(10,200)。 OPの投稿は一般的な答えの欲求を示すものではありません。 'n'(200)が' m'(10)のべき乗の要素でないかどうかについては、答えがより関与するだろう。しかし、なぜそこに止まるの? 'm.n'を_any_' int'の値で使うことができました。おそらく0で負でもあります。その解決法は、特に 'm> sqrt(RAND_MAX)'とIMOが、OPが今のところ準備ができている以上にはるかに関わっているでしょう。 – chux

関連する問題