Delphi (2006) Loop Help

Итак, что я по сути пытаюсь сделать, это что-то случиться в 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;
15.12.2008 15:46:39
Какая петля? Там нет цикла в коде, который вы показываете.
Craig Stuntz 15.12.2008 15:53:44
2 ОТВЕТА
РЕШЕНИЕ

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

Не звоните 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утверждение для каждого.

6
15.12.2008 16:16:09

Я просто изменил код 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.12.2008 16:37:19
Мне нравятся сделанные вами изменения, код гораздо
Charles Faiga 15.12.2008 16:44:35
Не звоните рандомизировать здесь; это не правильно. Сделайте это в разделе инициализации.
Craig Stuntz 17.12.2008 00:24:32