#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);
}
int dice() {
/* Создать 8 урн */
/*int buckets[8];*/
/* Выбрать случайную урну и попробовать добавить в неё шарик */
FILE
* URANDOM
= fopen("/dev/urandom", "r"); 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"); /* Случайное число между 1 и 5 */
if (random == 1) {
/* 1 случай из 5 */
return FALSE; /* Шарика нет */
} else {
/* 4 случая из 5 */
return TRUE; /* Шарик есть */
}
}