私は乱数の生成に関数random()%xを使用していますが、アプリケーションを起動するたびに、 。iPhone:random()関数は毎回同じ乱数を返します
私はその乱数に基づいていくつかの画像をランダムに配置しています。アプリケーションを何回実行しても、すべての画像が同じ場所に配置されていることがわかります。
私は乱数の生成に関数random()%xを使用していますが、アプリケーションを起動するたびに、 。iPhone:random()関数は毎回同じ乱数を返します
私はその乱数に基づいていくつかの画像をランダムに配置しています。アプリケーションを何回実行しても、すべての画像が同じ場所に配置されていることがわかります。
あなたはおそらくarc4random()
で幸運を祈るでしょう、明示的にそれを植える必要はなく、 "より良い"ランダムであるようです。アプリケーションデリゲートで
乱数ジェネレータを使用する前に、乱数ジェネレータを使用する前に、現在の時刻などの値を変更する必要があることを忘れないでください。
:擬似乱数が開始、またはシード値を必要とするため
- (void) applicationDidFinishLaunching:(UIApplication *)application
{
srandom(time(NULL));
// ...
for (int i = 0; i < 100; i++) {
NSLog(@"%d", random());
}
}
この作品理由があります。時間を使うことで、実行ごとに異なる「ランダム」数列を得る可能性が高くなります。
シード値を指定しない場合、同じシードが各実行時に使用され、同じシーケンスが生成されます。これは通常は望ましくない動作ですが、場合によっては、アルゴリズムのテストなどのために同じシーケンスを生成できると便利です。
ほとんどの場合、実行の間に変更されるシード値を指定すると、現在の時刻が便利になります。
ポスターは疑似乱数(http://en.wikipedia.org/wiki/Pseudorandom_number_generator)を読んで、元のコードがそのように動作した理由をよく理解しています。 –
'srandomdev()' –
最初にsrandomdev()を呼び出します。
srandomdev();
long my_rand = random();この記事に遭遇初心者のために
:
random()
機能はpseudo-random sequenceを生成します。 random()
ウェイは、使用するたびに同じ擬似ランダムシーケンスを提供します。シーケンスを「シード」して別の開始点を選択する必要があります。実行するたびに異なるように見えるようにします。システム時間を使用して(srandom(time(NULL))
をシードしたり、ヘルパー関数srandomdev()
を使用したりすることができます。試す実験に
:
#include "stdio.h"
int main(void) {
int i;
for (i = 0; i < 10; i++)
printf("%d\n", random());
return 0;
}
あなたは常に同じシーケンスを得るでしょう、私のコンピュータ上でそれを提供します:
1804289383
846930886
1681692777
1714636915
1957747793
424238335
719885386
1649760492
596516649
1189641421
もっと読み:
man random
。)は(選択のあなたの乱数機能または同等の)srandomを使用していますが、また、あなたがデバッグしている場合は、物事は常に同じように起こるように、その周りに条件文を使用します。私はまた、そのようなことをするときにNSLog警告を出す傾向があるので、私はbrian-deadコードを出荷しません。
#if DEBUG==0
srandom(time(NULL));
#else
NSLog(@"Debug build: Random numbers are not random!");
#endif
又は
if(!debuggingBuild)
srandom(time(NULL));
else
NSLog(@"Debug build: Random numbers are not random!");
必須XKCD comic:
これは、この質問の重複して表示されます。私は推薦するhttp://stackoverflow.com/questions/1436217/generating-random-values-in-iphone –