89611


C言語でサイコロを2個振ってゾロ目になる確率を求めるプログラムを書いているのですが, 実行結果が期待値のである1/36に近くならないです.  
以下, ソースです.

[code]

    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>
    
    int main(void){
        int i = 0;
        int microsecond = 1.0 * 1000;
        double count;
        int A,B,C,D,E,F;
        double sum;
        double average, avepro;
        sum = 0;
        struct timeval tv;
        gettimeofday(&tv, NULL);
        //srand((unsigned int)tv.tv_sec * ((unsigned int)tv.tv_usec + 1));
    
        srand(time(NULL)/60);
        
        //srand(tv.tv_sec + tv.tv_usec);
        
    
        for(count = 1;count < 101;count++){
        while (1){
        A = rand() % 6 + 1;
        usleep(microsecond);
        B = rand() % 6 + 1;
        C = rand() % 6 + 1;
        D = rand() % 6 + 1;
        E = rand() % 6 + 1;
        F = rand() % 6 + 1;
        i++;
        printf("A:%d,B:%d\n", A, B);
        //printf("A:%d:B:%d:C:%d:D:%d:E:%d:F:%d\n", A, B, C, D, E, F);
        if(A == B)
        //if(A == B && B == C && C == D && D == F)
        break;
        }
        sum += i;
        printf("%dで一致しました:試行回数は%d回です.\n", A,i);
        i = 0;
        }
        average = sum / (count + 1);
        avepro = average / 100;
        printf("平均回数:%f\n", average);
        printf("平均確率:%f\n", avepro);
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2022-06-26T08:23:51.817
89602
2022-06-26T11:38:43.667
50923
question
c
期待値の確率とかけ離れている


質問のコードを元に、修正してみました。

[code]

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>
    
    #define TRIAL (1000)
    
    int main(void){
        int i = 0;
        int microsecond = 1.0 * 1000;
        int count;
        int A,B,C,D,E,F;
        double sum;
        double much = 0, average = 0;
        sum = 0;
        struct timeval tv;
        gettimeofday(&tv, NULL);
        //srand((unsigned int)tv.tv_sec * ((unsigned int)tv.tv_usec + 1));
    
        srand(time(NULL));
        
        //srand(tv.tv_sec + tv.tv_usec);
        
    
        for (count = 1; count <= TRIAL; count++){
            A = rand() % 6 + 1;
            B = rand() % 6 + 1;
            printf("A:%d,B:%d\n", A, B);
            if(A == B) {
                much += 1;
                printf("%dで一致しました:試行回数は%d回です.\n", A,count);
            }
        }
        average = much / TRIAL;
        printf("平均回数:%f\n", much);
        printf("平均確率:%f\n", average);
        return 0;
    }
    
[/code]

TRIALで定義した試行回数が100位ですとまだ粗いですが、試行回数を1000, 10000回と増やしていくと、期待値である、  
6/6*6に近づいていくのが解ると思います。  
（最初はダイスが6個とも一致なので、1/36ですが、2個のダイスの一致なので6/36ですよね？）


CC BY-SA 4.0
2022-06-26T09:04:52.227
89603
2022-06-26T09:35:58.227
2022-06-26T09:35:58.227
14745
14745
89602
answer

[code]

    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h>
    #include <unistd.h>
    
    
    int main(void){
        int i = 0;
        int microsecond = 1.0 * 1000;
        double count;
        int A,B;
        double sum;
        double average, avepro;
        sum = 0;
        double equal = 0;
        struct timeval tv;
        gettimeofday(&tv, NULL);
    
        srand(time(NULL)/60);
    
        for(count = 1;count < 101;count++){
            while (1){
                A = rand() % 6 + 1;
                usleep(microsecond);
                B = rand() % 6 + 1;
                i++;
                printf("A:%d,B:%d\n", A, B);
                if(A == B){
                    equal ++;
                    printf("%dで一致しました:試行回数は%d回です.\n", A,i);
                    break;
                }
            }
            sum += count;
            i = 0;
        }
        average = equal / sum;
        printf("確率：%f", average);
        return 0;
    }
    
[/code]

出力例：

[code]

    A:1,B:6
    A:3,B:4
    A:1,B:5
    A:1,B:3
    A:4,B:5
    A:1,B:3
    A:5,B:1
    A:3,B:1
    A:6,B:1
    A:2,B:3
    A:4,B:1
    A:4,B:2
    A:5,B:6
    A:2,B:3
    A:6,B:1
    A:4,B:4
    4で一致しました:試行回数は16回です.
    A:5,B:6
    A:6,B:5
    A:2,B:6
    A:5,B:3
    A:3,B:4
    A:3,B:1
    A:2,B:5
    A:6,B:1
    A:4,B:5
    A:2,B:1
    A:3,B:5
    A:6,B:1
    A:4,B:5
    A:3,B:2
    A:6,B:6
    6で一致しました:試行回数は15回です.
    A:3,B:4
    A:4,B:2
    A:6,B:3
    A:2,B:4
    A:6,B:2
    A:1,B:6
    A:6,B:3
    A:3,B:5
    A:1,B:6
    A:3,B:2
    A:6,B:6
    6で一致しました:試行回数は11回です.
    A:1,B:5
    A:4,B:2
    A:3,B:1
    A:3,B:2
    A:4,B:4
    4で一致しました:試行回数は5回です.
    A:3,B:5
    A:5,B:2
    A:2,B:4
    A:6,B:5
    A:3,B:4
    A:4,B:3
    A:4,B:6
    A:1,B:5
    A:3,B:2
    A:6,B:2
    A:1,B:4
    A:4,B:2
    A:6,B:1
    A:2,B:6
    A:6,B:4
    A:3,B:3
    3で一致しました:試行回数は16回です.
    A:2,B:6
    A:4,B:3
    A:1,B:1
    1で一致しました:試行回数は3回です.
    A:5,B:4
    A:5,B:3
    A:6,B:6
    6で一致しました:試行回数は3回です.
    A:6,B:4
    A:4,B:3
    A:5,B:2
    A:2,B:3
    A:5,B:6
    A:5,B:4
    A:4,B:4
    4で一致しました:試行回数は7回です.
    A:2,B:3
    A:1,B:4
    A:3,B:3
    3で一致しました:試行回数は3回です.
    A:1,B:5
    A:3,B:6
    A:5,B:2
    A:3,B:1
    A:2,B:6
    A:1,B:5
    A:3,B:2
    A:5,B:2
    A:3,B:1
    A:2,B:6
    A:6,B:6
    6で一致しました:試行回数は11回です.
    A:3,B:1
    A:2,B:2
    2で一致しました:試行回数は2回です.
    A:1,B:2
    A:4,B:4
    4で一致しました:試行回数は2回です.
    A:2,B:4
    A:6,B:3
    A:3,B:4
    A:4,B:3
    A:3,B:3
    3で一致しました:試行回数は5回です.
    A:2,B:1
    A:1,B:3
    A:2,B:6
    A:2,B:3
    A:6,B:3
    A:2,B:3
    A:1,B:2
    A:3,B:2
    A:4,B:3
    A:1,B:1
    1で一致しました:試行回数は10回です.
    A:4,B:1
    A:2,B:3
    A:3,B:3
    3で一致しました:試行回数は3回です.
    A:5,B:6
    A:5,B:1
    A:2,B:5
    A:5,B:6
    A:1,B:6
    A:5,B:2
    A:2,B:2
    2で一致しました:試行回数は7回です.
    A:2,B:3
    A:2,B:6
    A:3,B:4
    A:1,B:6
    A:5,B:6
    A:4,B:6
    A:6,B:5
    A:3,B:6
    A:1,B:1
    1で一致しました:試行回数は9回です.
    A:5,B:6
    A:5,B:4
    A:2,B:3
    A:1,B:2
    A:6,B:6
    6で一致しました:試行回数は5回です.
    A:1,B:6
    A:5,B:2
    A:6,B:1
    A:6,B:2
    A:2,B:6
    A:5,B:6
    A:3,B:2
    A:6,B:6
    6で一致しました:試行回数は8回です.
    A:1,B:6
    A:5,B:1
    A:4,B:1
    A:4,B:6
    A:2,B:3
    A:6,B:3
    A:4,B:5
    A:6,B:2
    A:2,B:4
    A:2,B:2
    2で一致しました:試行回数は10回です.
    A:2,B:1
    A:1,B:4
    A:4,B:6
    A:1,B:5
    A:1,B:4
    A:4,B:1
    A:3,B:1
    A:6,B:4
    A:5,B:1
    A:3,B:1
    A:4,B:2
    A:1,B:5
    A:5,B:4
    A:1,B:6
    A:5,B:6
    A:5,B:1
    A:6,B:6
    6で一致しました:試行回数は17回です.
    A:2,B:1
    A:3,B:2
    A:5,B:3
    A:4,B:3
    A:2,B:4
    A:1,B:5
    A:2,B:5
    A:3,B:4
    A:5,B:6
    A:6,B:3
    A:3,B:4
    A:6,B:3
    A:1,B:5
    A:6,B:6
    6で一致しました:試行回数は14回です.
    A:3,B:5
    A:5,B:4
    A:3,B:5
    A:3,B:2
    A:5,B:6
    A:2,B:6
    A:4,B:2
    A:2,B:5
    A:6,B:5
    A:2,B:3
    A:4,B:5
    A:5,B:4
    A:6,B:3
    A:6,B:1
    A:1,B:3
    A:6,B:1
    A:5,B:2
    A:4,B:2
    A:6,B:6
    6で一致しました:試行回数は19回です.
    A:3,B:4
    A:6,B:4
    A:2,B:3
    A:5,B:1
    A:5,B:2
    A:5,B:4
    A:4,B:1
    A:3,B:1
    A:4,B:2
    A:3,B:2
    A:6,B:1
    A:4,B:5
    A:1,B:3
    A:6,B:4
    A:4,B:3
    A:1,B:6
    A:5,B:6
    A:1,B:4
    A:6,B:5
    A:4,B:2
    A:6,B:3
    A:6,B:2
    A:1,B:6
    A:2,B:4
    A:5,B:4
    A:3,B:5
    A:4,B:1
    A:3,B:4
    A:1,B:1
    1で一致しました:試行回数は29回です.
    A:5,B:2
    A:1,B:5
    A:1,B:5
    A:3,B:5
    A:6,B:6
    6で一致しました:試行回数は5回です.
    A:1,B:4
    A:2,B:4
    A:4,B:5
    A:5,B:4
    A:4,B:6
    A:5,B:2
    A:1,B:2
    A:6,B:4
    A:6,B:1
    A:5,B:6
    A:1,B:1
    1で一致しました:試行回数は11回です.
    A:1,B:5
    A:4,B:5
    A:2,B:4
    A:3,B:1
    A:3,B:1
    A:4,B:2
    A:4,B:1
    A:4,B:3
    A:2,B:1
    A:2,B:1
    A:1,B:1
    1で一致しました:試行回数は11回です.
    A:6,B:6
    6で一致しました:試行回数は1回です.
    A:4,B:5
    A:6,B:1
    A:2,B:4
    A:1,B:6
    A:3,B:2
    A:4,B:2
    A:5,B:4
    A:2,B:6
    A:4,B:6
    A:1,B:1
    1で一致しました:試行回数は10回です.
    A:4,B:3
    A:1,B:4
    A:3,B:1
    A:2,B:3
    A:1,B:1
    1で一致しました:試行回数は5回です.
    A:1,B:2
    A:3,B:4
    A:2,B:2
    2で一致しました:試行回数は3回です.
    A:6,B:1
    A:1,B:2
    A:2,B:2
    2で一致しました:試行回数は3回です.
    A:3,B:5
    A:3,B:2
    A:4,B:4
    4で一致しました:試行回数は3回です.
    A:5,B:2
    A:2,B:3
    A:4,B:3
    A:4,B:1
    A:3,B:5
    A:1,B:1
    1で一致しました:試行回数は6回です.
    A:3,B:5
    A:2,B:3
    A:3,B:2
    A:4,B:2
    A:2,B:2
    2で一致しました:試行回数は5回です.
    A:1,B:1
    1で一致しました:試行回数は1回です.
    A:3,B:1
    A:5,B:5
    5で一致しました:試行回数は2回です.
    A:2,B:6
    A:6,B:1
    A:2,B:1
    A:1,B:5
    A:1,B:4
    A:3,B:1
    A:6,B:2
    A:1,B:6
    A:6,B:1
    A:2,B:2
    2で一致しました:試行回数は10回です.
    A:2,B:5
    A:3,B:1
    A:6,B:1
    A:5,B:6
    A:1,B:2
    A:2,B:3
    A:1,B:1
    1で一致しました:試行回数は7回です.
    A:1,B:2
    A:1,B:5
    A:1,B:2
    A:6,B:1
    A:2,B:5
    A:2,B:1
    A:4,B:2
    A:1,B:5
    A:3,B:2
    A:1,B:4
    A:6,B:4
    A:4,B:4
    4で一致しました:試行回数は12回です.
    A:3,B:5
    A:5,B:4
    A:5,B:6
    A:2,B:3
    A:1,B:2
    A:1,B:5
    A:1,B:6
    A:4,B:1
    A:4,B:5
    A:1,B:5
    A:4,B:5
    A:1,B:5
    A:6,B:5
    A:6,B:3
    A:2,B:3
    A:6,B:2
    A:5,B:5
    5で一致しました:試行回数は17回です.
    A:3,B:1
    A:2,B:4
    A:3,B:6
    A:3,B:3
    3で一致しました:試行回数は4回です.
    A:3,B:2
    A:6,B:6
    6で一致しました:試行回数は2回です.
    A:2,B:1
    A:2,B:6
    A:5,B:6
    A:4,B:3
    A:4,B:1
    A:1,B:1
    1で一致しました:試行回数は6回です.
    A:3,B:6
    A:3,B:6
    A:5,B:6
    A:4,B:1
    A:6,B:3
    A:2,B:1
    A:3,B:5
    A:1,B:5
    A:6,B:1
    A:4,B:5
    A:5,B:3
    A:4,B:4
    4で一致しました:試行回数は12回です.
    A:2,B:5
    A:4,B:3
    A:3,B:3
    3で一致しました:試行回数は3回です.
    A:3,B:5
    A:2,B:4
    A:2,B:1
    A:3,B:6
    A:5,B:6
    A:6,B:1
    A:4,B:2
    A:3,B:3
    3で一致しました:試行回数は8回です.
    A:6,B:2
    A:1,B:1
    1で一致しました:試行回数は2回です.
    A:4,B:5
    A:4,B:5
    A:6,B:3
    A:3,B:4
    A:6,B:3
    A:4,B:6
    A:5,B:5
    5で一致しました:試行回数は7回です.
    A:3,B:6
    A:3,B:3
    3で一致しました:試行回数は2回です.
    A:3,B:6
    A:1,B:3
    A:6,B:2
    A:4,B:2
    A:4,B:2
    A:1,B:4
    A:2,B:4
    A:1,B:3
    A:2,B:6
    A:6,B:2
    A:1,B:3
    A:4,B:4
    4で一致しました:試行回数は12回です.
    A:6,B:2
    A:1,B:1
    1で一致しました:試行回数は2回です.
    A:1,B:1
    1で一致しました:試行回数は1回です.
    A:3,B:2
    A:6,B:1
    A:4,B:3
    A:3,B:1
    A:4,B:4
    4で一致しました:試行回数は5回です.
    A:6,B:2
    A:6,B:6
    6で一致しました:試行回数は2回です.
    A:3,B:6
    A:2,B:2
    2で一致しました:試行回数は2回です.
    A:5,B:5
    5で一致しました:試行回数は1回です.
    A:3,B:4
    A:5,B:4
    A:1,B:5
    A:3,B:1
    A:5,B:2
    A:2,B:5
    A:3,B:5
    A:6,B:6
    6で一致しました:試行回数は8回です.
    A:2,B:6
    A:4,B:3
    A:3,B:4
    A:3,B:2
    A:3,B:5
    A:1,B:2
    A:1,B:4
    A:1,B:1
    1で一致しました:試行回数は8回です.
    A:1,B:5
    A:5,B:1
    A:1,B:5
    A:6,B:5
    A:6,B:5
    A:4,B:2
    A:1,B:1
    1で一致しました:試行回数は7回です.
    A:1,B:2
    A:6,B:3
    A:3,B:6
    A:6,B:5
    A:2,B:6
    A:3,B:6
    A:1,B:1
    1で一致しました:試行回数は7回です.
    A:1,B:5
    A:2,B:1
    A:2,B:4
    A:6,B:2
    A:2,B:3
    A:1,B:6
    A:5,B:2
    A:1,B:5
    A:2,B:6
    A:5,B:1
    A:2,B:1
    A:6,B:5
    A:3,B:5
    A:2,B:5
    A:3,B:2
    A:4,B:3
    A:5,B:5
    5で一致しました:試行回数は17回です.
    A:2,B:6
    A:6,B:5
    A:5,B:5
    5で一致しました:試行回数は3回です.
    A:1,B:5
    A:4,B:3
    A:6,B:3
    A:1,B:1
    1で一致しました:試行回数は4回です.
    A:6,B:3
    A:5,B:5
    5で一致しました:試行回数は2回です.
    A:3,B:3
    3で一致しました:試行回数は1回です.
    A:1,B:5
    A:1,B:2
    A:2,B:1
    A:3,B:5
    A:2,B:5
    A:1,B:3
    A:4,B:4
    4で一致しました:試行回数は7回です.
    A:1,B:3
    A:6,B:5
    A:5,B:4
    A:5,B:3
    A:4,B:3
    A:1,B:1
    1で一致しました:試行回数は6回です.
    A:6,B:6
    6で一致しました:試行回数は1回です.
    A:5,B:6
    A:6,B:5
    A:3,B:4
    A:6,B:2
    A:5,B:6
    A:4,B:6
    A:5,B:2
    A:6,B:6
    6で一致しました:試行回数は8回です.
    A:5,B:4
    A:6,B:4
    A:6,B:3
    A:5,B:4
    A:3,B:6
    A:6,B:3
    A:6,B:3
    A:6,B:4
    A:3,B:5
    A:6,B:3
    A:3,B:3
    3で一致しました:試行回数は11回です.
    A:4,B:5
    A:3,B:1
    A:4,B:5
    A:6,B:3
    A:2,B:4
    A:6,B:6
    6で一致しました:試行回数は6回です.
    A:5,B:5
    5で一致しました:試行回数は1回です.
    A:2,B:2
    2で一致しました:試行回数は1回です.
    A:6,B:4
    A:1,B:5
    A:4,B:5
    A:6,B:4
    A:2,B:2
    2で一致しました:試行回数は5回です.
    A:6,B:6
    6で一致しました:試行回数は1回です.
    A:2,B:2
    2で一致しました:試行回数は1回です.
    A:2,B:5
    A:6,B:2
    A:3,B:1
    A:4,B:2
    A:1,B:6
    A:3,B:4
    A:5,B:1
    A:2,B:4
    A:2,B:5
    A:1,B:1
    1で一致しました:試行回数は10回です.
    A:4,B:4
    4で一致しました:試行回数は1回です.
    A:5,B:3
    A:5,B:4
    A:2,B:5
    A:3,B:3
    3で一致しました:試行回数は4回です.
    A:4,B:3
    A:5,B:2
    A:4,B:1
    A:6,B:6
    6で一致しました:試行回数は4回です.
    A:6,B:1
    A:5,B:2
    A:4,B:1
    A:6,B:4
    A:4,B:6
    A:2,B:2
    2で一致しました:試行回数は6回です.
    A:6,B:5
    A:3,B:4
    A:5,B:2
    A:5,B:4
    A:4,B:6
    A:6,B:1
    A:2,B:2
    2で一致しました:試行回数は7回です.
    A:6,B:3
    A:2,B:6
    A:2,B:5
    A:6,B:4
    A:6,B:3
    A:4,B:6
    A:6,B:5
    A:5,B:6
    A:6,B:2
    A:2,B:3
    A:3,B:1
    A:2,B:1
    A:2,B:5
    A:6,B:6
    6で一致しました:試行回数は14回です.
    A:3,B:5
    A:1,B:3
    A:6,B:1
    A:2,B:5
    A:5,B:1
    A:3,B:5
    A:1,B:4
    A:2,B:5
    A:1,B:4
    A:4,B:6
    A:5,B:5
    5で一致しました:試行回数は11回です.
    A:6,B:1
    A:3,B:1
    A:1,B:5
    A:3,B:5
    A:4,B:6
    A:1,B:4
    A:2,B:4
    A:4,B:1
    A:3,B:3
    3で一致しました:試行回数は9回です.
    A:1,B:3
    A:5,B:5
    5で一致しました:試行回数は2回です.
    A:4,B:4
    4で一致しました:試行回数は1回です.
    A:1,B:4
    A:1,B:4
    A:4,B:5
    A:1,B:1
    1で一致しました:試行回数は4回です.
    A:5,B:3
    A:2,B:3
    A:5,B:2
    A:5,B:2
    A:1,B:4
    A:4,B:6
    A:1,B:5
    A:6,B:3
    A:5,B:4
    A:3,B:3
    3で一致しました:試行回数は10回です.
    A:3,B:1
    A:6,B:3
    A:4,B:4
    4で一致しました:試行回数は3回です.
    A:5,B:5
    5で一致しました:試行回数は1回です.
    A:2,B:3
    A:6,B:4
    A:5,B:5
    5で一致しました:試行回数は3回です.
    A:1,B:2
    A:6,B:3
    A:3,B:5
    A:6,B:4
    A:4,B:5
    A:3,B:4
    A:5,B:5
    5で一致しました:試行回数は7回です.
    A:1,B:2
    A:2,B:1
    A:6,B:5
    A:2,B:1
    A:3,B:4
    A:6,B:2
    A:6,B:3
    A:6,B:2
    A:5,B:4
    A:3,B:2
    A:6,B:4
    A:6,B:4
    A:1,B:4
    A:2,B:1
    A:5,B:6
    A:6,B:3
    A:5,B:5
    5で一致しました:試行回数は17回です.
    A:2,B:4
    A:1,B:1
    1で一致しました:試行回数は2回です.
    A:5,B:1
    A:4,B:2
    A:3,B:1
    A:4,B:2
    A:2,B:6
    A:3,B:5
    A:1,B:2
    A:2,B:1
    A:3,B:6
    A:2,B:2
    2で一致しました:試行回数は10回です.
    A:1,B:4
    A:2,B:4
    A:4,B:4
    4で一致しました:試行回数は3回です.
    A:2,B:5
    A:2,B:2
    2で一致しました:試行回数は2回です.
    A:5,B:6
    A:1,B:6
    A:1,B:3
    A:6,B:2
    A:2,B:6
    A:1,B:4
    A:2,B:1
    A:3,B:3
    3で一致しました:試行回数は8回です.
    確率：0.019802
    
[/code]


CC BY-SA 4.0
2022-06-26T09:07:30.593
89604
2022-06-26T09:07:30.593
39819
89602
answer


Чайкаさんが指摘されている通り、期待値は 6/36 ですね。

そのほか指摘されていない点として

>
[code]

>     usleep(microsecond);
>  
[/code]

ウェイトを入れたところで乱数の結果は変化しません。時間の無駄となります。

>
[code]

>     double sum;
>     double average, avepro;
>     ...
>     sum += count;
>     ...
>     average = sum / (count + 1);
>  
[/code]

大きな数を扱うために`double`を選択したのでしょうか？
`double`は浮動小数点数であり大きな数を扱うことができると誤解されますが、`double`は仮数部つまり有効精度が52bitしかありません。有効精度以下の演算は丸め込まれるため、大きな数になった場合に
`sum += count` の演算は結果が変化しなくなります。結局、
**`double`は整数演算目的では52bit程度しか使えない**ことを覚えておくとよいでしょう。  
`uint64_t`もしくは`unsigned long long`の方がより大きな数を扱えます。`uint64_t`であれば64bitの整数を扱えます。

今回は関係ないようですが、[`rand()`は性能が悪く意図しない結果を引き起こすことがある](https://ja.stackoverflow.com/a/12005/4236)ため、使用には気を付ける必要があります。


CC BY-SA 4.0
2022-06-26T11:38:43.667
89611
2022-06-26T11:38:43.667
4236
89602
answer