为什么rand()%7总是返回0?

时间:2011-10-23 14:36:20

标签: objective-c c random

这似乎是一个非常奇怪的问题:

这是我的代码:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        srand((unsigned int)time(NULL));
        int newRandomNumber = 0;
        newRandomNumber = rand() % 7;
        NSLog(@"%d", rand() % 7); //This prints out what I expected
        NSLog(@"newRandomNumber = %d", newRandomNumber); // This always prints out 0!
    }
    return 0;
}

如果我更换那一行

newRandomNumber = rand() % 7

newRandomNumber = rand() % 8

一切都很完美。为什么会这样?

2 个答案:

答案 0 :(得分:36)

好吧,这个

int seed;
for(seed = 1; seed < 10; seed++) {
    srand(seed);
    printf("%4d %16d\n", seed, rand());
}

打印

   1            16807
   2            33614
   3            50421
   4            67228
   5            84035
   6           100842
   7           117649
   8           134456
   9           151263

这让我觉得rand() = seed * 16807

维基百科文章 Linear congruential generator 确认CarbonLib确实使用Xn + 1 = Xn * 16807来生成随机数。

答案 1 :(得分:9)

似乎不太可能但是运行一些测试,在第一个rand之后,第一个rand似乎总是可被7整除,至少在一个int大小的变量中。

在几次运行中,我得到1303562743,2119476443和2120232758,所有这些都是7到0。

第二个rand()有效,因为它是第二个rand()。在您的第一个rand()之前投出rand() ...或者更好,如果可用,请使用更好的随机数生成器randomarc4rand

另请参阅Stack Overflow问题 Why is (rand() % anything) always 0 in C++?