programing

랜드() %7이 항상 0을 반환하는 이유는 무엇입니까?

newstyles 2023. 8. 7. 22:24

랜드() %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;
}

만약 내가 그 한 줄을 바꾼다면,

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을 사용하여 임의의 숫자를 생성한다는 것을 확인합니다.

가능성은 낮아 보이지만 일부 검정을 실행하는 것은 적어도 크기가 큰 변수에서 sr과 첫 번째 랜드가 항상 7로 나누어집니다.

몇 번의 주행에서 저는 1303562743, 2119476443, 2120232758을 받았는데, 모두 모드 7대 0이었습니다.

두번째rand()효과가 있습니다, 왜냐하면 그것은 두 번째이기 때문입니다.rand()던지다rand()초행 전에rand()또는 더 나은, 더 나은 난수 생성기를 사용합니다.random또는arc4rand가능하면

C++에서 (rand() %anything)이 항상 0인 이유는 무엇입니까?라는 스택 오버플로 질문도 참조하십시오.

언급URL : https://stackoverflow.com/questions/7866754/why-does-rand-7-always-return-0