2

C++ で rand 関数を使用すると、次のようになります。

#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
int main(){
srand(time(0));
int n=(rand()%6)+1;
cout<<"The dice roll is "<<n<<"."<<endl;
}

5 行目で time_t から int への変換に関する警告が表示されます。

srand(time(0));

この警告を取り除く方法はありますか?

4

6 に答える 6

9

実際には、 srand() でunsigned int を使用する必要があります:

srand((unsigned) time(0));
于 2009-05-03T21:00:58.177 に答える
5

別のメモで、このコード:

rand()%6

一般的に悪い習慣と見なされています。rand() の下位ビットは、上位ビットよりも大幅にランダム性が低くなります。次のようにすると、ランダム性が向上します。

(rand() >> 8)%6

例えば。

編集:

詳細については、このメモと、少なくとも理由を示唆する Dr. Dobbsジャーナルの記事を参照してください。

注: 使用しないでください

  y = rand()  %  M;

これは rand() の下位ビットに焦点を当てているためです。rand() がよくある線形合同乱数ジェネレーターの場合、下位バイトは上位バイトよりもランダム性がはるかに低くなります。実際、最下位ビットは 0 と 1 の間を循環します。したがって、rand() は偶数と奇数の間を循環する場合があります (試してみてください)。注意 rand() は、線形合同乱数ジェネレーターである必要はありません。この問題のないより良いものであることは完全に許容されます。

DDJ:

最も重要な点は、通常の (線形合同) 乱数ジェネレーターからの出力の下位ビットが最も「ランダム」ではないということです。すなわち、下位ビットのパターンは共通である。したがって、あなたの議論におけるルーチン ロールからの出力は驚くべきものではありません。また、返される整数を決定するために上位ビットに依存することで回避できます。

たとえば、ランダムな「true」または「false」の値を選択する場合、次のコードを使用します。

rand() % 2

その後、結果のパターンが表示される場合があります。

1,0,1,0,1,0,1,0,1,0 (など)

これは明らかにそれほどランダムではありませんが、使用されている可能性のある線形合同ジェネレーターのプロパティです。全体として (C++ の場合) より良いスキームは、あらゆる種類のプラグ可能なランダム ジェネレーター (この欠陥を持たない Mersenne Twister を含む) をサポートするBoost.Randomライブラリを使用することです。

于 2009-05-03T21:03:15.847 に答える
2

警告を取り除くには、符号なし整数への静的キャストを使用する必要があります。

srand(static_cast<unsigned int>(time(0)));

これに関連して、rand の結果を右にシフトして、下位ビットの偏りを取り除く必要があります。

int n = ((rand() >> 8) % 6) + 1;

最後に、C++ では、C タイム ライブラリと標準ライブラリを次のように含める必要があります。

#include <ctime>
#include <cstdlib>

これにより、関数が適切な名前空間「std」に配置されます。

于 2009-05-03T23:01:24.487 に答える
2

明示的なキャストを使用して、警告を取り除きます。

srand((int)time(0));
于 2009-05-03T20:54:12.390 に答える
1

2 つの補足事項:

  • C++ に C ヘッダーを含める標準的な方法は、次のようになります#include <cstdio>
  • に渡されるパラメーターtime()はポインターであり、多くの人NULLは より読みやすい null ポインターだと考えています0
于 2009-05-03T21:05:28.570 に答える
0

また、

 rand() % 6

小さなバイアスを導入します。RAND_MAX % 6 は 1 であるため、0 と 1 は 2 から 6 よりもわずかに多くなります。この場合、より高い数値が返される 5461 回ごとに 5462 回返されるため、おそらく気付かないでしょう。ただし、必要な数値の範囲が広い場合、偏りが大きくなる可能性があります。たとえば、 を実行した場合、rand() % 320000 ~ 767 の範囲の数値は、768 ~ 32000 の数値の 2 倍の頻度で表示されます。

于 2009-05-03T21:30:50.103 に答える