2011-12-26 15 views
-3

私は0-100印刷200乱数

から乱数を返す関数getrand100()を持っているが、繰り返しそれらのどれとランダムな順序で番号1-200を印刷するためのコードスニペットを書きます。あなたはこれを行う方法を助けてください1から100

に乱数を取得するために)(時間の任意の数をgetrand100を呼び出すことができますか?あなたは一様分布のない要求を得なかっましたので、

+0

CとJavaの両方を定義しました。 – fge

+1

この宿題はありますか? – PeeHaa

+0

はい私は論理を探していますので、私はどちらかの言語で実装しています。 –

答えて

4

そして、0から200までの数字の配列を作成し、それらをシャッフルするFisher-Yates Shuffleを使用しています。

あなたgetrand100機能のみを0から100までの数字を与えているので、このような何かを書く:0〜200

にあなたの乱数を与える

int rnd = getrand100(); 
int scale = getrand100(); 
if (scale >= 50) 
    rnd += 100; 

は実際にはもう少し複雑ですそれは乱数の範囲が変わるからです。つまり、最初は0から200までの乱数を生成したいと思います。次回は0から199まで、次に198から197までなどです。乱数をスケールする方法が必要です。次のようなものは、一様分布にあなたが合理的に近い取得します:これは、丸め機能を持っていると仮定し

int rnd = getrand100(); 
double frnd = rnd/100.0; 
int realRnd = round(frnd * range); 

rangeはあなたの範囲のトップです。したがって、最初の呼び出しrangeは200、次に199などです。

これは完全な一様分布を与えません。これは、2桁の有効数字でしか処理されないためですが、教室にとって受け入れられる結果が得られます割り当て。

+1

重複はどうですか? – Hogan

+1

@Hogan:Fisher-Yates Shuffleに重複は問題ありません。配列はシャッフルされ、出力されます。 Wikipediaの記事を読んでください。 –

+1

要件。 OPは、重複することはできません、あなたの答えはその問題を解決しないと述べた。 – Hogan

2

は、getrand100() + getrand100()としてgetrand200()を定義します。 1-200の数字の配列を作成します。 getrand200を使用してFisher–Yates shuffleアルゴリズムのスキューされたバージョンを実装します。