2009-09-19 28 views
6

私は乱数の生成に関数random()%xを使用していますが、アプリケーションを起動するたびに、 。iPhone:random()関数は毎回同じ乱数を返します

私はその乱数に基づいていくつかの画像をランダムに配置しています。アプリケーションを何回実行しても、すべての画像が同じ場所に配置されていることがわかります。

+1

これは、この質問の重複して表示されます。私は推薦するhttp://stackoverflow.com/questions/1436217/generating-random-values-in-iphone –

答えて

16

あなたはおそらくarc4random()で幸運を祈るでしょう、明示的にそれを植える必要はなく、 "より良い"ランダムであるようです。アプリケーションデリゲートで

2

乱数ジェネレータを使用する前に、乱数ジェネレータを使用する前に、現在の時刻などの値を変更する必要があることを忘れないでください。

14

:擬似乱数が開始、またはシード値を必要とするため

- (void) applicationDidFinishLaunching:(UIApplication *)application 
{ 
    srandom(time(NULL)); 

    // ... 

    for (int i = 0; i < 100; i++) { 
     NSLog(@"%d", random()); 
    } 
} 

この作品理由があります。時間を使うことで、実行ごとに異なる「ランダム」数列を得る可能性が高くなります。

シード値を指定しない場合、同じシードが各実行時に使用され、同じシーケンスが生成されます。これは通常は望ましくない動作ですが、場合によっては、アルゴリズムのテストなどのために同じシーケンスを生成できると便利です。

ほとんどの場合、実行の間に変更されるシード値を指定すると、現在の時刻が便利になります。

+0

ポスターは疑似乱数(http://en.wikipedia.org/wiki/Pseudorandom_number_generator)を読んで、元のコードがそのように動作した理由をよく理解しています。 –

+0

'srandomdev()' –

2

最初にsrandomdev()を呼び出します。

srandomdev();
long my_rand = random();この記事に遭遇初心者のために

4

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ページを詳細については。 (ターミナルから実行man random。)
0

は(選択のあなたの乱数機能または同等の)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!"); 
4

arc4randomは、ランド()またはランダムよりもよりよい解決策であろう()。 thisを参照してください。

+0

このリンクありがとう - きれいな機能。 – Micko

関連する問題