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

0xd*_*0cc 35 c random objective-c

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

这是我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

如果我替换那一行说

newRandomNumber = rand() % 7
Run Code Online (Sandbox Code Playgroud)

newRandomNumber = rand() % 8
Run Code Online (Sandbox Code Playgroud)

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

geo*_*org 36

好吧,这个

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

版画

   1            16807
   2            33614
   3            50421
   4            67228
   5            84035
   6           100842
   7           117649
   8           134456
   9           151263
Run Code Online (Sandbox Code Playgroud)

这让我想到了 rand() = seed * 16807

维基百科文章线性同余生成器确认CarbonLib确实使用Xn + 1 = Xn*16807来生成随机数.

  • LCG 真是个糟糕的选择 (2认同)
  • 你遗漏的部分:因为`16807%7 == 0`,`(n*16807)%7 == 0`,只要你没有得到整数溢出. (2认同)

Gra*_*yer 9

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

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

第二个rand()工作,因为它是第二个rand().rand()在你的第一个之前扔掉rand()......或者更好的是,使用更好的随机数生成器random或者arc4rand如果可用的话.

另请参阅Stack Overflow问题为什么(rand()%any)在C++中始终为0?.