2009-09-19 150 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