为什么rand()%7总是返回0?
这似乎是一个很奇怪的问题:
这是我的代码:
#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; }
如果我replace那一行说
newRandomNumber = rand() % 7
同
newRandomNumber = rand() % 8
一切正常。 为什么会这样?
那么,这个
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
维基百科文章线性同余生成器证实CarbonLib确实使用Xn + 1 = Xn * 16807生成随机数。
看起来不太可能,但运行一些testing后,第一个rand似乎总是可以被7整除,至less在一个int大小的variables。
在几次运行中,我得到了1303562743,2119476443和2120232758,所有这些都是7到0。
第二个rand()
工作,因为它是第二个rand()
。 在你的第一个rand()
之前抛出一个rand()
…或者更好,如果可用的话,使用一个更好的随机数发生器random
或者arc4rand
。
另请参阅堆栈溢出问题为什么(rand()%anything)在C ++中始终为0? 。