C言語での乱数生成で常に同じ値となってしまうケースがある


以下のコードで `num` は0~6になる思うのですが、すべて4になってしまいます。  
`num=rand()%7` の7を他の数字でやると0〜その数字の間の数となります。  
7の時のみこのようになってしまうのですがなぜでしょうか？

環境は MacBook Pro、xcode Version 6.1です。

[code]

    #include<time.h>
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void){
        int i,num;
    
        srand(time(NULL));
        num=rand()%7;
    
        for(i=0;i<10;i++){
            printf("%d\n",num);
        }
        return 0;
    }
    
[/code]




forループの中で `num`
の値は変更されていませんから、最初に決まった値を毎回表示することになります。必要であればforループの中で`num`の値を再設定してください。

[code]

    for(i=0;i<10;i++){
        num=rand()%7;
        printf("%d\n",num);
    }
    
[/code]

* * *

quesera2さんがXcodeにおけるrandの実装のリンクを張られています。

[code]

    static int
    do_rand(unsigned long *ctx)
    {
    #ifdef  USE_WEAK_SEEDING
    /*
     * Historic implementation compatibility.
     * The random sequences do not vary much with the seed,
     * even with overflowing.
     */
        return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));
    #else   /* !USE_WEAK_SEEDING */
    /*
     * Compute x = (7^5 * x) mod (2^31 - 1)
     * wihout overflowing 31 bits:
     *      (2^31 - 1) = 127773 * (7^5) + 2836
     * From "Random number generators: good ones are hard to find",
     * Park and Miller, Communications of the ACM, vol. 31, no. 10,
     * October 1988, p. 1195.
     */
        long hi, lo, x;
    
        /* Can't be initialized with 0, so use another value. */
        if (*ctx == 0)
            *ctx = 123459876;
        hi = *ctx / 127773;
        lo = *ctx % 127773;
        x = 16807 * lo - 2836 * hi;
        if (x < 0)
            x += 0x7fffffff;
        return ((*ctx = x) % ((u_long)RAND_MAX + 1));
    #endif  /* !USE_WEAK_SEEDING */
    }
    
[/code]

となっています。`srand(time(NULL));`直後の`rand()%7`の値に限定すると、  
変数`hi`は`127773`で除算しているので127773秒ごとにしか変化しません。変数`lo`は`7^5`を乗じているので7の倍数です。つまり、127773秒（およそ35.5時間）周期でしか7の剰余の値は変化しません。

