Objective c 为什么我总是得到相同的随机值?

Objective c 为什么我总是得到相同的随机值?,objective-c,c,random,Objective C,C,Random,可能重复: 即使使用不同的程序(在同一台机器上)运行/编译,并且在函数的值为零(之前和之后)之后,我也会感到困惑。。不管怎样。。每次运行时,我都会得到相同的“随机”数字。我发誓这不是应该的工作方式。。我将尽可能简单地说明 #import <Foundation/Foundation.h> int main(int argc, char *argv[]) { int rPrimitive = 0; rPrimitive = 1 + rand() % 50; NSN

可能重复:

即使使用不同的程序(在同一台机器上)运行/编译,并且在函数的值为零(之前和之后)之后,我也会感到困惑。。不管怎样。。每次运行时,我都会得到相同的“随机”数字。我发誓这不是应该的工作方式。。我将尽可能简单地说明

#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;           
}
在CodeRunner中运行它:

i686-apple-darwin11-llvm-gcc-4.2
8  9
0  (null)
如果你愿意,可以运行一百万次。你可以想象它将永远是什么样子。为什么会发生这种情况?为什么?为什么是这样?

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


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

因为数字不是随机的,而是随机的。它们是根据一种算法生成的,给定相同的初始种子,该算法将始终产生相同的输出。您没有对PRNG进行种子设定,因此它使用默认的常量种子


如果使用不太可预测的内容(如当前时间和/或PID)为PRNG设定种子,每次都会得到不同的结果。在的情况下,您需要为它添加种子。

之所以这样,是因为
rand
是一个伪随机数生成器,这意味着它不会生成真正的随机数(这实际上是一件非常困难的事情)。它使用“seed”生成序列中的下一个数字,并且在执行开始时,seed始终设置为相同的值(1左右),因此如果不更改seed,您将始终获得相同的随机数序列。您可以使用类似于
srand(time(NULL))
根据时间为随机数生成器设定种子,或者您可以使用被认为足够强大的随机数生成器进行加密


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

Ahh,是的,我以前使用过arc4random,这就是为什么这看起来很奇怪的原因。。事实上,将
#define rand()(arc4random()%((无符号)rand_MAX+1))
放在main之前,再次给宇宙带来了意义。谢谢。在确定性机器(又称计算机)中,“生成”真正的随机数是不可能的,也不难。你需要一个外部随机性源。@alexgray即使这样做,你仍然在使用伪随机数,只是碰巧arc4random本身带有比常量值更独特的东西
1
@AaronDufour:OpenBSD的“外部源”包括鼠标移动、网络活动、,当然,它仍然不是真正的随机性,但对于几乎所有的实际用途来说,它都是随机的。而且,这不是不可能的,这是困难的。请参阅。@dreamlax这些都不涉及“生成”随机性。他们使用外部数据源,我指出这是获得真实随机数的唯一方法。我的问题实际上更多地涉及到这样一个事实,即这些结果跨越操作系统/内存的逻辑分区,并且尽管将值赋值为null,但它们仍然会出现,而不是赋值给
rand
,这本身就意味着不同的OSs使用相同的PRNG,这并不意外。设置null不会改变任何东西,因为这是
rand
的预期行为,而不是内存错误。请不要删除自动生成的重复链接。您可以标记此问题以引起主持人的注意,如果您认为应该重新打开此问题,也可以在上提出此问题。请注意,常见的模式是
srand(time(NULL))
,以便程序的连续运行获得不同的种子。
i686-apple-darwin11-llvm-gcc-4.2
8  9
0  (null)
   If no seed value is provided,  the  rand()  function  is  automatically
   seeded with a value of 1.