Итак, я создавал программу, которая вызывала бы функцию и возвращала 0 или 1 (0 означает решку, а 1 — решку), а затем использовала ее для вывода результатов 100 подбрасываний.
Казалось бы, достаточно просто подумать, что я могу использовать srand(time(NULL)) для заполнения rand() постоянно меняющимися начальными значениями. Вот это была моя первая трещина.
#include <stdio.h>
#include <stdlib.h>
int flip();
int main(void) {
int heads = 0;
int tails = 0;
for (short int count = 1; count <= 100; ++count) {
int number = flip();
if (number == 0) {
printf("%s", "Tails");
++tails;
}
else if (number == 1) {
printf_s("%s", "Heads");
++heads;
}
}//end for
printf_s("\n%d Tails\n", tails);
printf_s("%d Heads", heads);
}//end main
int flip(void) {
srand(time(NULL));
int number = (int)rand();
printf("%d", number%2);
return number%2;
}//end flip
Я запускал программу, и мое значение rand() всегда было пятизначным целым числом, повторяющимся в каждой итерации оператора for (т.е. 15367, 15745 или 15943).
Я бездельничал, пока не обнаружил, что изменение srand(time(NULL)) на srand(time(NULL)*time(NULL)/rand()) помогло.
Моя единственная мысль заключается в том, что время между каждой итерацией настолько мало, что часть времени (NULL) функции srand() не изменяется достаточно, чтобы передать другое начальное значение.
Я также попробовал srand(time(NULL)/rand()), однако это давало один и тот же результат (52 орла и 48 решек) каждый раз, когда я запускал программу (более 20 раз); однако все значения rand() отличались друг от друга.
Я не знаю, почему это произошло, или почему сработала конечная функция srand(time(NULL)*time(NULL)/rand()), и мне бы очень хотелось, чтобы кто-нибудь объяснил!
rand
использование с % не дает вам хорошего распределения. Вам лучше использоватьreturn number > RAND_MAX/2;
(как правило, number*desiredMax/RAND_MAX — хороший подход — при условии, что вы правильно обрабатываете возможное переполнение). - person Aconcagua   schedule 18.10.2018