我使用函数random()%x来生成随机数,但每次启动应用程序时,我都会看到它创建或生成相同的数字。
就像我根据随机数随机放置一些图像一样,无论我运行应用程序多少次,我都会看到所有图像都放在同一个地方。
答案 0 :(得分:16)
你可能会有更好的运气arc4random()
,你不需要明确地播种它,它似乎是一个“更好”的随机。
答案 1 :(得分:15)
强制性XKCD comic:
答案 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!");