我正在使用函數random()%x生成一個隨機數,但每次啓動應用程序時,我都會看到它創建或生成的數字相同。iPhone:隨機()函數每次給我相同的隨機數
就像我根據隨機數隨機放置一些圖像,並且我看到所有圖像放置在相同的位置,無論我運行該應用程序多少次。
我正在使用函數random()%x生成一個隨機數,但每次啓動應用程序時,我都會看到它創建或生成的數字相同。iPhone:隨機()函數每次給我相同的隨機數
就像我根據隨機數隨機放置一些圖像,並且我看到所有圖像放置在相同的位置,無論我運行該應用程序多少次。
你可能會有更好的運氣,arc4random()
,你不需要明確地種下它,它似乎是一個「更好」的隨機。
不要忘記,在使用它之前,需要通過srandom對隨機數生成器進行種子處理,並使用不同的值,例如當前時間。
在您的應用程序委託:
- (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)進行一些閱讀,以便更好地理解原始代碼爲什麼表現如此。 – 2009-09-20 23:10:05
'srandomdev()'。 – 2011-10-04 00:59:52
先撥叫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警告,所以我不會發布布萊恩死的代碼。
#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 – 2009-09-20 01:28:43