2009-09-19 197 views
6

我正在使用函數random()%x生成一個隨機數,但每次啓動應用程序時,我都會看到它創建或生成的數字相同。iPhone:隨機()函數每次給我相同的隨機數

就像我根據隨機數隨機放置一些圖像,並且我看到所有圖像放置在相同的位置,無論我運行該應用程序多少次。

+1

這似乎是這個問題的一個副本:http://stackoverflow.com/questions/1436217/generating-random-values-in-iphone – 2009-09-20 01:28:43

回答

16

你可能會有更好的運氣,arc4random(),你不需要明確地種下它,它似乎是一個「更好」的隨機。

2

不要忘記,在使用它之前,需要通過srandom對隨機數生成器進行種子處理,並使用不同的值,例如當前時間。

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)進行一些閱讀,以便更好地理解原始代碼爲什麼表現如此。 – 2009-09-20 23:10:05

+0

'srandomdev()'。 – 2011-10-04 00:59:52

2

先撥叫srandomdev()。

srandomdev();
long my_rand = random();

4

對於遇到這個帖子的新手:

random()功能產生pseudo-random sequencerandom()每次使用它時,都會給出相同的僞隨機序列。您需要對種子進行「種子」選擇不同的起點,因此每次運行時都會有所不同。您可以使用系統時間播種(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。)
0

確實使用srandom(或者類似的你選擇的隨機數函數),而且使用條件左右,所以,如果你正在調試中,事情總是會發生相同的方式。在做類似這樣的事情時,我也傾向於使用NSLog警告,所以我不會發布布萊恩死的代碼。

#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 2010-10-23 11:17:18