問題は追加です。rand()
のint
値を返します0...RAND_MAX
。したがって、2つ追加すると、最大でになりRAND_MAX * 2
ます。それを超える場合INT_MAX
、加算の結果はan int
が保持できる有効範囲をオーバーフローします。符号付き値のオーバーフローは未定義の動作であり、キーボードが外国語で話しかける可能性があります。
ここで2つのランダムな結果を追加しても利益はないので、単純なアイデアは単にそれを行わないことです。またはunsigned int
、合計を保持できる場合は、各結果を加算前にキャストできます。または、より大きなタイプを使用します。long
は必ずしもより大きいとは限らないことに注意してください。64ビット以上の場合int
も同じです。long long
int
結論:追加は避けてください。それはより多くの「ランダムさ」を提供しません。より多くのビットが必要な場合は、値を連結するsum = a + b * (RAND_MAX + 1)
こともできますが、その場合は、よりも大きなデータ型が必要になる可能性がありint
ます。
あなたが述べた理由は結果がゼロになるのを避けることです:rand()
両方ともゼロになる可能性があるので、2つの呼び出しの結果を追加してもそれは避けられません。代わりに、増分することができます。の場合RAND_MAX == INT_MAX
、これはで実行できませんint
。ただし、(unsigned int)rand() + 1
非常に可能性が高いです。可能性が高い(決定的ではない)。UINT_MAX > INT_MAX
これは、が必要であるためです。これは、私が知っているすべての実装に当てはまります(これには、過去30年間の組み込みアーキテクチャ、DSP、およびデスクトップ、モバイル、サーバーのすべてのプラットフォームが含まれます)。
警告:
すでにここのコメントに振りかけますが、してください2つのランダムな値を追加することはないことに注意してくださいない均一な分布を得るが、2個のダイスを転がすような三角分布:取得する12
(2個のダイスを)両方のダイスは示さなければなりません6
。以下のための11
2つの可能な変形既に存在している6 + 5
か5 + 6
など、
したがって、この点からも加算は悪いです。
また、rand()
生成される結果は、疑似乱数ジェネレータによって生成されるため、互いに独立していないことに注意してください。また、規格は計算値の品質や均一分布を指定していないことにも注意してください。
rand()
否定的であってはなりません...