#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define ARR_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))

/* Терминология: */
/* bucket = урна */
/* ball = шарик */

enum {
    TRUE, /* Шарик есть */
    FALSE /* Шарика нет */
};

enum {
    NEVER_GOT_TO_THE_LAST_BUCKET,
    LAST_BUCKET_GOT_A_BALL,
    LAST_BUCKET_DID_NOT_CONTAIN_A_BALL
};

int dice();
int get_random_bucket_state();

int buckets[8];

int main(int argc, char** argv) {
    int false_times = 0;
    int true_times = 0;

    for (int i = 0; i < 10000; i++) {
        for (int i = 0; i < ARR_SIZE(buckets); i++) {
            buckets[i] = FALSE;
        }

        int roll = dice();

        switch (roll) {
            case NEVER_GOT_TO_THE_LAST_BUCKET:{
            	//do nothing
            } break;
            
            case LAST_BUCKET_GOT_A_BALL:{
            	true_times++;
            } break;
                
            case LAST_BUCKET_DID_NOT_CONTAIN_A_BALL:{
            	 false_times++;
            } break;
               
            default:{
            	assert(0 && "INTERNAL ERROR:DICE ROLL VALUE");   	 
            } break;
        }
    }

    double result = (double) true_times / ((double) true_times + (double) false_times);
    printf("%lf\n", result);
}

int dice() {
    /* Создать 8 урн */
    /*int buckets[8];*/

    /* Выбрать случайную урну и попробовать добавить в неё шарик */
    FILE* URANDOM = fopen("/dev/urandom", "r");
    srand(getc(URANDOM));
    fclose(URANDOM);
    buckets[rand() % ARR_SIZE(buckets)] = get_random_bucket_state();

    /* Для каждого ведра */
    for (int i = 0; i < ARR_SIZE(buckets); i++) {
        /* Если мы просмотрели все 7 вёдер и осталось только 1 ведро */
        /* ********************************************************* */
        /* Данный код выполняется только если мы уже просмотрели
           все 7 ведёр */
        /* ********************************************************* */
        /* (Размер массива (buckets) отсчитывается с 0, поэтому первое ведро = buckets[0],
                                                        а восьмое ведро = buckets[7] */
        /* ********************************************************* */
        /* Таким образом, если мы уже дошли до номера 7,
           то мы имеем дело с последним, восьмым ведром */
        /* ********************************************************* */
        if (i == 7) {
            if (buckets[i] == TRUE) {
                /* Если в ведре есть шарик */
                return LAST_BUCKET_GOT_A_BALL;
            } else {
                /* Если в ведре нет шарика */
                return LAST_BUCKET_DID_NOT_CONTAIN_A_BALL;
            }
        }

        /* Этот код выполняется когда мы просматриваем ведро
           с номером 1, 2, 3, 4, 5, 6 или 7. */
        /* ********************************************** */
        /* Если мы просматриваем ведро номер 8, то этот код не выполняется */
        if (buckets[i] == TRUE) {
            /* Если в ведре есть шарик */
            return NEVER_GOT_TO_THE_LAST_BUCKET;
        }
        /* Если в этом ведре не оказалось шарика, то мы переходим к следующему ведру */
    }
}

/* Шарик есть в одной из урн в 4 случаях из 5 */
int get_random_bucket_state() {
    FILE* URANDOM = fopen("/dev/urandom", "r");
    srand(getc(URANDOM));
    fclose(URANDOM);
    /* Случайное число между 1 и 5 */
    int random = rand() % 6;

    if (random == 1) {
        /* 1 случай из 5 */
        return FALSE; /* Шарика нет */
    } else {
        /* 4 случая из 5 */
        return TRUE; /* Шарик есть */
    }
}