fork(1) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  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. continue;
  40. case LAST_BUCKET_GOT_A_BALL:
  41. true_times++;
  42. case LAST_BUCKET_DID_NOT_CONTAIN_A_BALL:
  43. false_times++;
  44. }
  45. }
  46.  
  47. double result = (double) true_times / ((double) true_times + (double) false_times);
  48. printf("%lf\n", result);
  49. }
  50.  
  51. int dice() {
  52. /* Создать 8 урн */
  53. /*int buckets[8];*/
  54.  
  55. /* Выбрать случайную урну и попробовать добавить в неё шарик */
  56. FILE* URANDOM = fopen("/dev/urandom", "r");
  57. srand(getc(URANDOM));
  58. fclose(URANDOM);
  59. buckets[rand() % ARR_SIZE(buckets)] = get_random_bucket_state();
  60.  
  61. /* Для каждого ведра */
  62. for (int i = 0; i < ARR_SIZE(buckets); i++) {
  63. /* Если мы просмотрели все 7 вёдер и осталось только 1 ведро */
  64. /* ********************************************************* */
  65. /* Данный код выполняется только если мы уже просмотрели
  66.   все 7 ведёр */
  67. /* ********************************************************* */
  68. /* (Размер массива (buckets) отсчитывается с 0, поэтому первое ведро = buckets[0],
  69.   а восьмое ведро = buckets[7] */
  70. /* ********************************************************* */
  71. /* Таким образом, если мы уже дошли до номера 7,
  72.   то мы имеем дело с последним, восьмым ведром */
  73. /* ********************************************************* */
  74. if (i == 7) {
  75. if (buckets[i] == TRUE) {
  76. /* Если в ведре есть шарик */
  77. return LAST_BUCKET_GOT_A_BALL;
  78. } else {
  79. /* Если в ведре нет шарика */
  80. return LAST_BUCKET_DID_NOT_CONTAIN_A_BALL;
  81. }
  82. }
  83.  
  84. /* Этот код выполняется когда мы просматриваем ведро
  85.   с номером 1, 2, 3, 4, 5, 6 или 7. */
  86. /* ********************************************** */
  87. /* Если мы просматриваем ведро номер 8, то этот код не выполняется */
  88. if (buckets[i] == TRUE) {
  89. /* Если в ведре есть шарик */
  90. return NEVER_GOT_TO_THE_LAST_BUCKET;
  91. }
  92. /* Если в этом ведре не оказалось шарика, то мы переходим к следующему ведру */
  93. }
  94. }
  95.  
  96. /* Шарик есть в одной из урн в 4 случаях из 5 */
  97. int get_random_bucket_state() {
  98. FILE* URANDOM = fopen("/dev/urandom", "r");
  99. srand(getc(URANDOM));
  100. fclose(URANDOM);
  101. /* Случайное число между 1 и 5 */
  102. int random = rand() % 6;
  103.  
  104. if (random == 1) {
  105. /* 1 случай из 5 */
  106. return FALSE; /* Шарика нет */
  107. } else {
  108. /* 4 случая из 5 */
  109. return TRUE; /* Шарик есть */
  110. }
  111. }
Success #stdin #stdout 4.61s 9424KB
stdin
Standard input is empty
stdout
0.243483