2

cocos2d ゲームでは、arc4random を使用して次のような乱数を生成します。

    float x = (arc4random()%10 - 5)*delta;

(デルタは、スケジュールされた更新方法での更新間の時間です)

    NSLog(@"x: %f", x);

そんな感じでチェックしてきました。

私が得る数字のほとんどは次のようなものです:

    2012-12-29 15:37:18.206 Jumpy[1924:907] x: 0.033444

また

    2012-12-29 15:37:18.247 Jumpy[1924:907] x: 0.033369

しかし、何らかの理由で、次のような数字が時々表示されます。

    2012-12-29 15:37:18.244 Jumpy[1924:907] x: 71658664.000000

編集:デルタはほとんどの場合:

    2012-12-29 17:01:26.612 Jumpy[2059:907] delta: 0.016590

-5 から 5 の範囲の数値 (いくつかの小さな数値を掛けたもの) を返す必要があると考えました。なぜこのような数値が得られるのでしょうか?

4

3 に答える 3

6

arc4randomを返しますu_int32_t そのu_部分は、署名されていないことを示しています。したがって、括弧内のすべての演算子は符号なし算術演算を使用します。

2 - 5符号なし 32 ビット演算を使用して減算を実行すると、 2 32 + 2 - 5 = 2 32 - 3 = 4294967293 (「巨大な数」) が得られます。

減算を実行する前に符号付き型にキャストします。また、arc4random_uniformデプロイ ターゲットが iOS 4.3 以降である場合は次のようにします。

float x = ((int)arc4random_uniform(10) - 5) * delta;

範囲に -5 と 5 を含める場合は、範囲 [-5,5] (両端を含む) に 11 個の要素が含まれるため、10 ではなく 11 を使用する必要があります。

float x = ((int)arc4random_uniform(11) - 5) * delta;
于 2012-12-29T22:18:35.373 に答える
1

arc4randomu_int32_t符号なしタイプの を返します。モジュラスは、予想どおり、0 から 9 までの数値を生成する符号なし算術演算を使用して実行されます (ちなみに、これを行うことはありませんarc4random_uniform。代わりに使用してください)。次に 5 を減算します。これは符号なしの値として解釈され、アンダーフローのために非常に大きな正の値になる可能性があります。

解決策は、5 を符号付きの変数に格納するか、接尾辞 ( など5L) を付けて明示的に入力することです。

于 2012-12-29T22:19:43.870 に答える
0

のように見え、後で負の整数で作業していますarc4random % 105

の値はdelta?

于 2012-12-29T20:54:40.000 に答える