0

可能重复:
为什么我总是用 rand() 得到相同的随机数序列?

我感到困惑的是,即使使用不同的程序(在同一台机器上)来运行/编译,并且在取消函数(之前和之后)函数之后..没关系..我会继续得到相同的“随机”数字……每次我运行它。我发誓这不是它应该如何工作的......我将尽可能简单地说明......</p>

#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)

如果你愿意,可以运行一百万次。你可以猜到它永远是什么。为什么会这样?为什么哦为什么这是“它是这样的”?

4

3 回答 3

6

这就是为什么(来自rand手册页):

   If no seed value is provided,  the  rand()  function  is  automatically
   seeded with a value of 1.

因为它总是以相同的数字作为种子,所以它总是会产生相同的数字序列。要让它在每次运行时产生不同的序列,您需要在每次运行时使用不同的种子。您可以使用srand()设置种子。

于 2012-04-12T23:29:32.567 回答
3

因为数字不是随机的,所以它们是伪随机的。它们是根据一种算法生成的,在给定相同的初始种子的情况下,该算法将始终产生相同的输出。您没有播种 PRNG,因此它使用默认的常量种子。

如果您使用不太可预测的东西(例如当前时间和/或 PID)为 PRNG 播种,则每次都会得到不同的结果。在 的情况下rand(3),您需要使用srand(3).

于 2012-04-12T23:30:21.527 回答
2

之所以这样,是因为它rand是一个伪随机数生成器,这意味着它不会生成真正的随机数(这实际上是一件非常困难的事情)。它使用“种子”生成序列中的下一个数字,并且在执行开始时,种子总是设置为相同的值(1 左右),所以如果你不改变种子,你总是会得到相同的随机数序列。您可以使用诸如srand(time(NULL));根据时间播种随机数生成器之类的东西,或者您可以使用被认为足以用于加密目的的随机数生成器,arc4random.

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

于 2012-04-12T23:35:36.980 回答