2012-01-13 7 views
2

iOSプラットフォームでマルチプレイヤーゲームを作成したいと思います。ゲームは、次に起こることを決定するために動的に生成された乱数に依存していました。しかし、それはマルチプレイヤーゲームなので、一貫性のあるゲームプレイをするためには、この「乱数」はすべてのプレーヤーのすべてのデバイスで同じでなければなりません。信頼できる疑似乱数を生成

そのため、すべてのデバイス(iPad/iPhone/iPodTouch)とすべてのOSバージョンで同じ番号の乱数を生成し続けるよりも、最初に同じ番号をシードすると、信頼性の高い擬似乱数生成器が必要です。

srandrandのように見えますが、私にはわかりませんが、randはすべてのOSバージョンですべてのデバイスで同じ番号を生成することを保証していますか?それ以外の場合は、任意の良い擬似乱数生成アルゴリズムですか? C標準から

答えて

7

(と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; 
} 

そして、より良いジェネレータは周りがあるという事実にもかかわらず、:あなた本当には、標準自体に、そのような一例として、独自の線形合同法を、アップコーディングすることができ、ことを保証したい場合単純な線形合同法は統計家や暗号学者でなければ一般的にはそれ以上のものです。

0

randにシード値を指定する場合は、同じシーケンスの擬似乱数を一貫して提供する必要があります。 arc4random()を試すこともできます。

+0

これは特定の実装では当てはまりますが、必ずしもすべての実装ではありません。 – paxdiablo