这似乎是一个非常奇怪的问题:
这是我的代码:
#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
一切都很完美。为什么会这样?
答案 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()
...或者更好,如果可用,请使用更好的随机数生成器random
或arc4rand
。
另请参阅Stack Overflow问题 Why is (rand() % anything) always 0 in C++? 。