可能重复:
why do i always get the same sequence of random numbers with rand()?
我很惊讶甚至使用不同的程序(在同一台机器上)来运行/编译,并且在nau之后(在之前和之后)函数...这没什么关系..我将继续获得相同的“随机”数字...每次我运行它。我发誓这不是它应该如何运作..我将尽可能简单地说明......
#import <Foundation/Foundation.h>
int main(int argc, char *argv[]) {
int rPrimitive = 0; rPrimitive = 1 + rand() % 50;
NSNumber *rObject = nil; rObject = [NSNumber numberWithInt:rand() % 10];
NSLog(@"%i %@", rPrimitive, rObject);
rPrimitive = 0; rObject = nil;
NSLog(@"%i %@", rPrimitive, rObject);
return 0;
}
在TextMate中运行:
i686-apple-darwin11-llvm-gcc-4.2
8 9
0 (null)
在CodeRunner中运行:
i686-apple-darwin11-llvm-gcc-4.2
8 9
0 (null)
如果你愿意,可以运行一百万次。你可以猜到它将永远是什么。为什么会这样?为什么这就是“它是怎么回事”?
答案 0 :(得分:6)
这就是为什么(来自rand
手册页):
If no seed value is provided, the rand() function is automatically
seeded with a value of 1.
由于它总是以相同的数字播种,因此它将始终产生相同的数字序列。为了让它在每次运行时生成不同的序列,每次运行时都需要使用不同的种子。您可以使用srand()
设置种子。
答案 1 :(得分:3)
因为这些数字不是随机的,所以它们是pseudorandom。它们是根据一种算法生成的,在给定相同的初始种子的情况下,该算法将始终产生相同的输出。你没有播种PRNG,所以它使用默认的常数种子。
如果使用不太可预测的东西(例如当前时间和/或PID)播种PRNG,每次都会得到不同的结果。对于rand(3)
,您需要使用srand(3)
种子。
答案 2 :(得分:2)
之所以如此,是因为rand
是一个伪随机数生成器,这意味着它不会生成真正的随机数(这实际上是非常难点去做)。它使用“种子”在序列中生成下一个数字,并且在执行开始时,种子总是设置为相同的值(1左右),所以如果你不更改种子,你将永远得到相同的随机数序列。您可以使用srand(time(NULL));
之类的内容根据时间为随机数生成器播种,或者您可以使用被认为足够强大的随机数生成器来加密,arc4random
。
你可能会说“为什么会这样?”,但在某些情况下你想要多次生成相同系列的“随机数”。