Delphi (2006) Loop Help - PullRequest
       23

Delphi (2006) Loop Help

1 голос
/ 15 декабря 2008

Итак, что я, по сути, пытаюсь сделать, - это чтобы что-то происходило в 70% случаев, еще несколько вещей происходили в 10% случаев каждый, если это имеет смысл, но мое приложение, похоже, не выполняет никаких действий, которые я Полагаю, я неправильно понимаю синтаксис цикла или что-то еще, если кто-нибудь может взглянуть и, возможно, дать мне совет

per1 := 70;
per2 := 77;
per3 := 84;
per4 := 91;
per5 := 100;
per6 := Random(2) + 1;
randomize;
RandPer:= Random(100);
randomize;
RandPer2 := Random(100);

 if RandPer2 <= 70 then begin
If RandPer <= per1 then begin
  Functiontest(1);
    end Else If RandPer <= per2 then begin
      Functiontest(3);
     end Else begin If RandPer <= per3 then begin
      Functiontest(5);
        end Else begin  If RandPer <= per4 then begin
        Functiontest(6);
          end Else begin If RandPer <= per5 then begin
          Functiontest(9);
          end;
         end;
        end;
      end;

Ответы [ 2 ]

6 голосов
/ 15 декабря 2008

Я просто изменил код CharlesF, чтобы сделать то, что вам нужно. Надеюсь, Чарльз не возражает.

begin
  randomize;
  for i := 0 to NumberOfTimesNeed do
  begin
    R :=  Random(100);
    case R of 
       0..69  : Functiontest(1); // this will fire 70% of NumberofTimes
       70..79 : Funciotntest(2); // 10 percent 
       80..89 : Funciotntest(3); // 10 percent 
       90..94 : Funciotntest(4); //  5 percent  
       // and so on ...
    end; 
end;
6 голосов
/ 15 декабря 2008

У вас нет синтаксиса цикла, так что это, безусловно, источник вашей путаницы.

Не звоните 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.

...