2010-12-08 17 views

答えて

6

...以下のコメントを1として

srand((unsigned)time(NULL)); 
r = (rand()%(B-A)) + A; 

、B-Aは、実際には、RAND_MAXよりも大きいことが可能です。この場合は、より注意する必要があります。

+0

私自身の答えはここでコメントしますが、明確にするために、Karl K. srand関数は一度呼び出すだけでよい。 –

+0

間隔 'B-A'が 'RAND_MAX + 1 'より大きい場合は注意してください。その場合、 'r'の値は一様に分布しません。' r'の最大値は 'RAND_MAX + A'になります。 –

+0

彼はAとBがintであり、私は最大intより小さいRAND_MAXを見たことがないと言いました。私はあなたが正しいと思うが、私はそれが非常に最悪の場合であると仮定しようとしている。 –

3

srandを一度だけとし、randで乱数を取得する必要があります。 rand関数は、0からある定数までの数値を返します。RAND_MAX;結果を目的の範囲にマッピングするのはあなたの責任です。これを行う伝統的な方法は、モジュラス演算子を使用することです。この演算子は、整数除算の結果得られる余りを返します。たとえば、7つの異なる結果が必要な場合は、rand() % 7をとり、結果は(0,1,2,3,4,5,6)のいずれかになります。 Andrew Whiteの例のように、結果の望ましい範囲を作成するためにオフセットを追加します。

srandが一度だけ呼び出されるようにする最も簡単な方法は、main()の先頭またはその近くで行うことです。

詳細については、これらの機能のマニュアルを参照してください。

+1

GNU Cは、標準には存在しないいくつかの拡張機能(他の関数のスコープ内で関数を定義する機能など)を提供するCの方言です。 – dreamlax

+0

私は訂正しました。それに応じて編集(そのビットを削除)。どこかに実際の仕様があるのですか、GCCコンパイラの拡張機能によって定義されていますか? –

関連する問題