22

この質問がすでに回答されている場合はお詫び申し上げます。

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main () {

srand( time(NULL) );
cout << rand();
}

「暗黙の変換は整数の精度を失います: 'time_t' (別名 'long') から 'unsigned int' へ」

上記のコードを実行したときに表示されるエラー メッセージです。私はxcode 4.6.1を使用しています。codepad.orgのような別のコンパイラを使用すると、乱数のように見えるものを完全に正常に生成するので、回避する必要があるのはxcodeの問題だと思いますか?

私はプログラミングを始めたばかりなので、これに関しては完全な初心者です。私のコードに問題がありますか、それとも私のコンパイラですか?

どんな助けでも大歓迎です!

4

5 に答える 5

16

「nio」が述べたように、明確な回避策は明示的に型キャストすることです。

より深い説明:

srand() はパラメーター ( ) として unsigned int を必要としますsrand(unsigned int)が、time() は long int ( long int time()) を返し、これは srand() によって受け入れられないため、これを修正するには、コンパイラーは単純に型キャスト (変換) する必要があります。 long int」から「unsigned int」へ。

しかし、あなたの場合、コンパイラーは代わりにそれについて警告します(コンパイラーの設計者は、それがすべてであることに注意する必要があると考えていたため)。

とてもシンプルな

srand( (unsigned int) time(NULL) );

トリックを行います!

(私が何か間違ったことをした場合は許してください。これがスタックオーバーフローに関する私の最初の回答です)

于 2013-07-12T17:57:55.220 に答える
2

これはエラーではありません。コードは有効であり、その意味は明確に定義されています。コンパイラがコンパイルを拒否した場合、コンパイラは言語定義に準拠していません。ほとんどの場合、それはwarningであり、コンパイラの作成者が、あなたが間違いを犯した可能性があると考えていることを伝えています。他の人が示唆しているように、警告メッセージを削除することを主張する場合は、キャストを追加できます。私は、一部のコンパイラ作成者の優れたスタイルの概念を満たすために、有効で意味のあるコードを書き直すことはあまり好きではありません。警告をオフにします。ただし、そうすると、コンバージョンによって意図しないデータが失われる他の場所を見逃す可能性があります。

于 2013-07-12T16:20:03.317 に答える
0
#include <stdlib.h>
#include <iostream>         //rand
#include <time.h>       //time

float randomizer(int VarMin, int VarMax){
    srand((unsigned)time(NULL));
        int range = (VarMax - VarMin);
        float rnd = VarMin + float(range*(rand()/(RAND_MAX + 1.0)));
return rnd;
}
于 2013-11-21T19:20:13.623 に答える