iPhone:random()函数每次给我相同的随机数

时间:2009-09-19 23:04:55

标签: iphone random

我使用函数random()%x来生成随机数,但每次启动应用程序时,我都会看到它创建或生成相同的数字。

就像我根据随机数随机放置一些图像一样,无论我运行应用程序多少次,我都会看到所有图像都放在同一个地方。

8 个答案:

答案 0 :(得分:16)

你可能会有更好的运气arc4random(),你不需要明确地播种它,它似乎是一个“更好”的随机。

答案 1 :(得分:15)

强制性XKCD comic

alt text

答案 2 :(得分:14)

在您的申请代表中:

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

    // ...

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

这样做的原因是因为伪随机数生成器需要一个起始或种子值。通过使用时间,您在每次执行时更有可能获得不同的“随机”数字序列。

如果未指定种子值,则在每次执行时使用相同的种子,从而产生相同的序列。这通常是不期望的行为,但在某些情况下,能够生成相同的序列是有用的,例如,用于测试算法。

在大多数情况下,您需要指定在运行之间更改的种子值,这是当前时间派上用场的地方。

答案 3 :(得分: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 random。)

答案 4 :(得分:4)

arc4random 将是比rand()或random()更好的解决方案。请参阅this

答案 5 :(得分:2)

不要忘记你需要在使用之前通过srandom对随机数生成器进行播种,并使用更改的值,例如当前时间。

答案 6 :(得分:2)

首先调用srandomdev()。

  

srandomdev();
  long my_rand = random();

答案 7 :(得分: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!");