fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #define ARR_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
  5.  
  6. /* Терминология: */
  7. /* bucket = урна */
  8. /* ball = шарик */
  9.  
  10. enum {
  11. TRUE, /* Шарик есть */
  12. FALSE /* Шарика нет */
  13. };
  14.  
  15. enum {
  16. NEVER_GOT_TO_THE_LAST_BUCKET,
  17. LAST_BUCKET_GOT_A_BALL,
  18. LAST_BUCKET_DID_NOT_CONTAIN_A_BALL
  19. };
  20.  
  21. int dice();
  22. int get_random_bucket_state();
  23.  
  24. int buckets[8];
  25.  
  26. int main(int argc, char** argv) {
  27. int false_times = 0;
  28. int true_times = 0;
  29.  
  30. for (int i = 0; i < 10000; i++) {
  31. for (int i = 0; i < ARR_SIZE(buckets); i++) {
  32. buckets[i] = FALSE;
  33. }
  34.  
  35. int roll = dice();
  36.  
  37. switch (roll) {
  38. case NEVER_GOT_TO_THE_LAST_BUCKET:{
  39. //do nothing
  40. } break;
  41.  
  42. case LAST_BUCKET_GOT_A_BALL:{
  43. true_times++;
  44. } break;
  45.  
  46. case LAST_BUCKET_DID_NOT_CONTAIN_A_BALL:{
  47. false_times++;
  48. } break;
  49.  
  50. default:{
  51. assert(0 && "INTERNAL ERROR:DICE ROLL VALUE");
  52. } break;
  53. }
  54. }
  55.  
  56. double result = (double) true_times / ((double) true_times + (double) false_times);
  57. printf("%lf\n", result);
  58. }
  59.  
  60. int dice() {
  61. /* Создать 8 урн */
  62. /*int buckets[8];*/
  63.  
  64. /* Выбрать случайную урну и попробовать добавить в неё шарик */
  65. FILE* URANDOM = fopen("/dev/urandom", "r");
  66. srand(getc(URANDOM));
  67. fclose(URANDOM);
  68. buckets[rand() % ARR_SIZE(buckets)] = get_random_bucket_state();
  69.  
  70. /* Для каждого ведра */
  71. for (int i = 0; i < ARR_SIZE(buckets); i++) {
  72. /* Если мы просмотрели все 7 вёдер и осталось только 1 ведро */
  73. /* ********************************************************* */
  74. /* Данный код выполняется только если мы уже просмотрели
  75.   все 7 ведёр */
  76. /* ********************************************************* */
  77. /* (Размер массива (buckets) отсчитывается с 0, поэтому первое ведро = buckets[0],
  78.   а восьмое ведро = buckets[7] */
  79. /* ********************************************************* */
  80. /* Таким образом, если мы уже дошли до номера 7,
  81.   то мы имеем дело с последним, восьмым ведром */
  82. /* ********************************************************* */
  83. if (i == 7) {
  84. if (buckets[i] == TRUE) {
  85. /* Если в ведре есть шарик */
  86. return LAST_BUCKET_GOT_A_BALL;
  87. } else {
  88. /* Если в ведре нет шарика */
  89. return LAST_BUCKET_DID_NOT_CONTAIN_A_BALL;
  90. }
  91. }
  92.  
  93. /* Этот код выполняется когда мы просматриваем ведро
  94.   с номером 1, 2, 3, 4, 5, 6 или 7. */
  95. /* ********************************************** */
  96. /* Если мы просматриваем ведро номер 8, то этот код не выполняется */
  97. if (buckets[i] == TRUE) {
  98. /* Если в ведре есть шарик */
  99. return NEVER_GOT_TO_THE_LAST_BUCKET;
  100. }
  101. /* Если в этом ведре не оказалось шарика, то мы переходим к следующему ведру */
  102. }
  103. }
  104.  
  105. /* Шарик есть в одной из урн в 4 случаях из 5 */
  106. int get_random_bucket_state() {
  107. FILE* URANDOM = fopen("/dev/urandom", "r");
  108. srand(getc(URANDOM));
  109. fclose(URANDOM);
  110. /* Случайное число между 1 и 5 */
  111. int random = rand() % 6;
  112.  
  113. if (random == 1) {
  114. /* 1 случай из 5 */
  115. return FALSE; /* Шарика нет */
  116. } else {
  117. /* 4 случая из 5 */
  118. return TRUE; /* Шарик есть */
  119. }
  120. }
Success #stdin #stdout 4.85s 9424KB
stdin
Standard input is empty
stdout
0.334807