我正在使用函数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