2

iOS プラットフォームでマルチプレイヤー ゲームを作成したいと考えています。このゲームは、次に何が起こるかを決定するために、動的に生成される乱数に依存していました。ただし、これはマルチプレイヤー ゲームであるため、この「乱数」は、一貫したゲーム プレイを実現するために、すべてのプレイヤーのすべてのデバイスで同じである必要があります。

そのため、最初に同じ数値をシードすると、すべてのデバイス (iPad/iPhone/iPodTouch) とすべての OS バージョンで同じ乱数シーケンスを生成し続ける、信頼性の高い疑似乱数ジェネレーターが必要です。

私のために仕事をするようsrandに見えますが、すべてのOSバージョンですべてのデバイスで同じ番号を生成することを保証するかどうかはわかりませんか? そうでなければ、適切な疑似乱数生成アルゴリズムはありますか?randrand

4

2 に答える 2

7

C標準から(そしてObjective CはCの上の薄い層なので、これはまだ保持されるべきです):

その後、srand が同じシード値で呼び出された場合、疑似乱数のシーケンスが繰り返されます。

異なる実装 (または同じ実装の異なるバージョン) がシードに基づいて一貫したシーケンスを提供するという保証はありません。本当にそれを保証したい場合は、標準自体の例のように、独自の線形合同ジェネレーターをコーディングできます。

// RAND_MAX assumed to be 32767.
static unsigned long int next = 1;
void srand(unsigned int seed) { next = seed; }
int rand(void) {
    next = next * 1103515245 + 12345;
    return (unsigned int)(next/65536) % 32768;
}

また、より優れたジェネレーターが存在するという事実にもかかわらず、統計学者や暗号学者でない限り、単純な線形合同法のジェネレーターで十分です。

于 2012-01-13T07:43:02.750 に答える
0

rand にシード値を指定すると、同じ疑似乱数のシーケンスが一貫して提供されるはずです。arc4random() を試すこともできます。

于 2012-01-13T07:44:44.673 に答える