2008-12-15 9 views
1

Donc, ce que j'essaie essentiellement de faire, c'est d'avoir quelque chose qui se passe 70% du temps, encore quelques choses se produisent 10% du temps, si cela a du sens mais mon application ne semble pas faire l'une des actions je suppose que je suis mal compris la syntaxe de la boucle ou quelque chose, de toute façon si quelqu'un pouvait jeter un oeil et peut-être me donner quelques conseilsDelphi (2006) Aide en boucle

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; 
+0

Quelle boucle? Il n'y a pas de boucle dans le code que vous montrez. –

Répondre

6

Vous n'avez une syntaxe de boucle, de sorte que est certainement une source possible de votre confusion. Ne pas appeler Randomize plusieurs fois. Il réinitialise la graine aléatoire chaque fois que vous le faites, et cela est basé sur l'horloge du système. Si votre code s'exécute plus vite que l'horloge avance, alors vos plusieurs appels à Randomizeréinitialiseront la graine aléatoire à la même valeur que précédemment, entraînant des appels répétés Random retournant la même valeur.

L'aide vous conseille d'appeler Randomize juste une fois au début de votre programme. Si vous écrivez une unité ou un composant et que vous n'êtes pas responsable de l'ensemble du programme, n'appelez pas du tout Randomize. Au lieu de cela, documentez que les consommateurs de votre code devraient l'appeler eux-mêmes.

Si vous écrivez une DLL et n'utilisez pas de packages d'exécution, appelez Randomize dans une fonction d'initialisation que votre DLL exporte; les consommateurs de votre DLL n'auront pas accès à la copie de votre DLL de la bibliothèque d'exécution Delphi.

Aussi, si vous voulez quelque chose se produise 70 pour cent du temps, alors vous devriez vérifier si votre valeur est strictement inférieur à 70. Les valeurs de retour possibles de Random comprennent zéro; 70% des résultats seront compris entre 0 et 69 inclus. En laissant 70, l'événement se produira dans 71% des cas. Enfin, vos calculs de 10 pour cent du temps n'ont pas de sens pour moi. Vous avez trois événements qui se produiront dans 7% des cas, et un événement qui se produira dans 9% des cas. Vous ne pouvez pas avoir quatre événements qui se produisent chacun 10 pour cent du temps quand il vous reste seulement 30 pour cent. Voulez-vous dire que la fréquence de chaque événement doit être mesurée indépendamment des autres? Si c'est le cas, ne liez pas tous vos tests conditionnels avec else; Utilisez complètement une instruction distincte if pour chacun d'eux.

6

Je viens de modifier le code CharlesF pour faire ce dont vous avez besoin. Hope CharlesF ne m'en voudra pas.

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; 
+0

J'aime les modifications que vous avez faites, le code est beaucoup plus lisible  –

+1

N'appelez pas Randomize ici; c'est faux. Faites-le dans la section d'initialisation. –