为什么我一直得到相同的随机值?

时间:2012-04-12 23:25:52

标签: objective-c c random

  

可能重复:
  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)
如果你愿意,可以运行一百万次。你可以猜到它将永远是什么。为什么会这样?为什么这就是“它是怎么回事”?

3 个答案:

答案 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

你可能会说“为什么会这样?”,但在某些情况下你想要多次生成相同系列的“随机数”。