Luka @ 24.10.2012
Ок. Остается только перепроверить, реализована ли логика конкретного случая:
0 + 0 - 37 = 37 = 0 в програмном коде.
Вот как реализован замес
Код
function TfrmMain.GetRnd: Integer;
var
i: Integer;
begin
Result:=0; //Обнуляем результат
for i:=1 to FRng.DelphiRandom do Result:=(Result+Random(37)); //Генерируем заданное количество случайных чисел с помощью ГСЧ Delphi и приплюсовываем к результату
for i:=1 to FRng.MersennVihr do Result:=(Result+VihrRandom); //Генерируем заданное количество случайных числе с помощью Вихря и приплюсовываем к результату
Result:=Result mod 37; //Окончательный результат равен остатку от целочисленного деления полученной суммы на 37
end;
Отдельно остановлюсь на последней строчке.
Операция "Остаток от целочисленного деления" реализованая во всех процессорах и выполняется очень быстро, что в нашем случае немаловажно.
Частный случай 0 разделить на 37 = результат 0, остаток
0.
Ещё примеры:
45 / 37 = результат 1, остаток
837/ 37 = результат 1, остаток
015 / 37 = результат 0, остаток
15Все возможные варианты для замеса 1 Дельфи + 1 Вихрь приведены в таблице, которую я выкладывал.
Физическая аналогия такой операции следующая.
1. Берём колесо, на котором 37 секторов (от 0 до 36) расположены по порядку по часовой стрелке
2. Кладём шарик на 0 на этом колесе
3. Получаем произвольное количество случайных чисел, которые суммируем. Например, получилось 45
4. Перемещаем шарик на полученное количество секторов по часовой стрелке. Для нашего примера: перемещаем шарик на 45 секторов по часовой стрелке: через 37 шагов мы вернёмся в ноль и у нам останется сделать ещё 45 - 37 = 8 перемещений, в результате которых шарик окажется на секторе №8
Операция "Остаток от целочисленного деления" сразу даёт нам искомый результат: 45 / 37 = результат 1, остаток
8
Как математика при этом доказывает, что замесом с дргугим ГПСЧ у нас ничего принципиально не меняется, я вот этого не очень понимаю...