Вроде, ошибок не нашёл.
Выкладываю критическое место в коде, которое отвечает за логику расчётов с самыми подробными комментариями.
Возможно, кто-то найдёт ошибку:
while true do begin
Application.ProcessMessages; //Это, чтобы программа не висела, пока расчёт идёт
wheel:=$1FFFFFFFFF; //Это 64-битное число записываем в каждый бит, начиная с младшего,
//37 единичек. Каждая единичка (бит) указывает на то, что это
//число ещё не выпадало. Когда число выпадет, мы заменим единичку на 0
inc(i); //Увеличиваем счётчик общего количества испытаний
inc(i01); //Этот счётчик используется для того, чтобы каждый 1 млн. испытаний
//Обновлять информацию в отчёте
//Генерируем первые FN чисел (FN-это параметр, который мы задаём. По умолчанию FN=500)
for i02:=1 to FN do begin
num:=1;
rnd:=Random(37); //Здесь мы генерируем случайое число от 0 до 36
//при помощи встроенного ГПСЧ Delphi
wheel:=wheel and (not (num shl rnd)); //В этой строке мы сбрасываем бит, соответствующий
//выпавшему случайному числу. Т.е. заменяем единичку на
//нолик (см. выше)
if wheel=0 then break; //Если все биты сброшен, т.е. все числа от 0 до 36
//уже выпали, то прекращаем генерацию, т.к. эта последовательность
//нам не интересна
end;
if wheel<>0 then begin //Если есть невыпашие номера, то обрабатываем их
inc(n); //Увеличиваем счётчик найденных ситуаций, когда наш номер не выпал заданное число раз
//Берём первый попавшийся невыпавший номер (их может быть несколько)
MyNumb:=-1;
for i02:=0 to 36 do begin
num:=1;
num:=num shl i02;
if (wheel and num)<>0 then begin
MyNumb:=i02; //Здесь мы нашли номер, который у нас не выпадал 500 раз
break;
end;
end;
if MyNumb<>-1 then begin
//Генерируем оставшиеся FK (задаётся пользователем, по умолчанию =35) номеров и записываем статистику
found:=false; //Наш искомый номер ещё не найден...
foundCnt:=0; //... и не выпадал пока ни разу
for i03:=1 to FK do begin
rnd:=Random(37); //Генерируем случайное число
if rnd=MyNumb then begin //Если это наш искомый номер ...
if not found then begin
inc(T[i03]); //...то записываем на каком шаге он выпал в первый раз ...
found:=true; //...и запоминаем, что первое выпадение уже было...
end;
Inc(foundCnt); //Увеличиваем счётчик количества выпадений искомого номера
end;
end;
if not found then inc(T[0]); //Если номер так и не удалось найти, то фиксируем это
inc(K[foundCnt]); //Записываем в массив для отчёта, сколько раз выпал наш номер
end;
end;
if i01=1000000 then begin //Обновляем отчёт после миллиона испытаний
i01:=0;
PrintInfo;
end;
if FNeedStop then begin //Если пользователь нажал СТОП, то обновляем отчёт и выходим из цикла
PrintInfo;
break;
end;
Сама программа:
PFF.zip
(991 килобайт)
Кол-во скачиваний: 120
Если кому-то нужны исходники, обращайтесь.
Я предполагал, что каждый сможет обработать полученные отчёты в Excell и вывести не только среднее арифметическое, но и любые другие показатели, которые ему заблогорассудится. Задача программы - собрать статистику.