У вас нет синтаксиса цикла, так что это, безусловно, источник вашей путаницы.
Не звоните Randomize
несколько раз. Он каждый раз повторно инициализирует случайное начальное число, и это основано на системных часах. Если ваш код работает быстрее, чем часы, то несколько ваших вызовов Randomize
фактически сбросят случайное начальное число на то же значение, которое было раньше, в результате повторные вызовы Random
возвращают одно и то же значение.
Помощь советует вам позвонить Randomize
только один раз в начале вашей программы. Если вы пишете модуль или компонент и не отвечаете за всю программу, то вообще не вызывайте Randomize
. Вместо этого документируйте, что потребители вашего кода должны называть его сами.
Если вы пишете DLL и не используете пакеты времени выполнения, то вызовите Randomize
в функции инициализации, которую экспортирует ваша DLL; потребители вашей DLL не будут иметь доступа к копии DLL библиотеки времени выполнения Delphi.
Кроме того, если вы хотите, чтобы что-то происходило в 70% случаев, вам следует проверить, действительно ли ваше значение строго меньше 70. Возможные возвращаемые значения Random
включают ноль; 70 процентов результатов будут между 0 и 69 включительно. Если разрешить 70, событие будет происходить в 71% случаев.
Наконец, ваши вычисления в 10 процентах случаев не имеют смысла для меня. У вас есть три события, которые произойдут в 7 процентах случаев, и одно событие произойдет в 9 процентах случаев. У вас не может быть четырех событий, каждое из которых происходит в 10% случаев, когда у вас осталось только 30%. Вы имеете в виду, что частота каждого события измеряется независимо от других? Если это так, то не связывайте все свои условные тесты вместе с else
; Для каждого используйте полностью отдельный оператор if
.