4

iPhone 5S のアップデートで、アプリが新しい 64 ビット プロセッサをサポートできるようにしたいと考えています。

ただし、64 ビットを使用すると、long を int にキャストする場合のように、大きなデータ型を小さなデータ型にキャストすると、切り捨てが発生する可能性があります。ほとんどの場合、これはより大きなデータ型を使用するだけで簡単に修正できますが、「time(NULL)」関数を使用してシードされることがある乱数ジェネレーターの場合、それはできません。

現在のコードは単純です:

srandom(time(NULL));

しかし、64 ビットの XCode 5 では、次のエラーが発生していますImplicit conversion loses integer precision: 'time_t' (aka 'long') to 'unsigned int'。これは、「time(NULL)」が long 整数を返し、「srandom」が unsigned int を必要とするためです。したがって、次の 2 つのオプションがあります。

  1. long 整数を unsigned int に変換します
  2. 「time(NULL)」を、同じ仕事をするが unsigned int を返す別の関数に置き換えます。

どちらをお勧めしますか?また、そのためにはどの機能を使用すればよいですか?

注: 反復可能な結果を​​得るために乱数ジェネレーターをシードできる必要があるため、arc4random() の代わりに random() を使用します。

4

2 に答える 2

7

time()通常、エポックからの秒数を返します (閏秒はカウントしません)。つまり、1 秒間に 2 回以上使用した場合 (または 2 人が同時にプログラムを実行した場合)、同じ値が返され、次のようになります。あなたがそれを望まないときでさえ、繰り返されるシーケンス。time(NULL)切り捨てによる警告 (または -Werror によるエラー) がない場合でも、シードとして使用しないことをお勧めします。

arc4random()時間に基づくシードの代わりに、ランダム シードを取得するために使用できます。また、表示されているエラーを修正する符号なし 32 ビット値を返すこともあります。

srandom(arc4random());

Objective-C++ への移行を検討して、標準の C++<random>ライブラリを使用できるようにすることもできます。このライブラリは、他のライブラリよりもはるかに強力で柔軟であり、多くのアイデアをよりシンプルかつ直接的に表現することも可能にします。

C++<random>ドキュメント

于 2013-09-11T15:53:10.037 に答える