begin process at 2008 07 05 13:28:37
1 205 182 membres
158 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème d'aléatoire [ Système / Exécution ] (artmonchrie2)

Problème d'aléatoire le 14/05/2008 17:44:41

artmonchrie2
Bonjour à tous,

Je crée un générateur de jeu de role et dans celui-ci je suis souvent amené à faire des jets de dé. Le jeu demandant différents types de dés j'ai créé la procédure suivante

function DE(nombre : integer):integer;
var
  Nb : integer;
 
begin
  randomize;
  if nombre = 100
  then
    Nb := random(100)   //On considère que le dé 100 va de 00 à 99
  else
    Nb := random(nombre)+1;

  DE := Nb;
end;


En plus du générateur j'ai voulu créer une petite fonction qui permet juste de lancé des dés. Sur une fiche je lis le nombre de dés et les types à lancer et j'appelle "n" fois la précédure de lancer de dé.
ça compile, mais lorsque je demande de lancer 3 dés 3 (par exemple) le score des dés est toujours le même... Pourtant je ne fait pas 3 DE(3), j'appelle bien 3 fois de suite ma procédure. Ce serait plutôt DE(3) + DE(3) + DE(3)
Et pourtant il semblerait que le résultat affiché soit à chaque fois le meme. (2+ 2+ 2 ou 1+ 1+1 etc...)

Fait encore plus étrange, quand j'utilise le mode pas à pas, je n'ai plus ce soucis. a croire qu'avec le mode pas à pas, il "n'oublie" pas de refaire des jets aléatoires.
Voila la procédure qui lance les dés

procedure JETER_DES(nbDes : string; numero : integer; var score : integer; var LBResultat : TListBox);
var
  cpt , defaut: integer;
  scoreint : integer;      //Score intermédiaire
  ligne : string;            //contient les résultats intermédiaires

begin

  if StrtointDef(nbDes, defaut) >= 1
  then
    begin
      for cpt := 1 to strtoInt(nbDes) do
        begin
          scoreint := DE(numero);
          score := score + scoreint;
          AFFICHE_RESULT(scoreint, ligne);
        end;
      LBResultat.items.add(ligne);
    end;

end;

Est ce qu'il y aurait une faille dans le code que je ne vois pas ? Ou peut -être une feinte ?
Merci d'avance

Re : Problème d'aléatoire le 14/05/2008 20:32:46

f0xi
Membre Club
(Admin CS)
// couper ici --8<---------------------------------------------------- //
// et copier dans un fichier.pas vide a renomer en "JDRDes"
unit JDRDes;

interface

uses Windows, SysUtils;

type
  TDes = record
    faces: byte;
    min  : Shortint;
    max  : Shortint;
  end;

  TDesType = (
    dtD2,    dtD3,    dtD4,    dtD5,
    dtD6,    dtD7,    dtD8,    dtD10,
    dtD12,   dtD16,   dtD20,   dtD24,
    dtD30,   dtD34,   dtD50,   dtD100
  );

function LaunchDe(const DT : TDesType; const ND: byte = 1): integer;

implementation

const
  DesDatas : array[TDesType] of TDes = (
     (faces: 2;   min: 1; max: 2),
     (faces: 3;   min: 1; max: 3),
     (faces: 4;   min: 1; max: 4),
     (faces: 5;   min: 1; max: 5),
     (faces: 6;   min: 1; max: 6),
     (faces: 7;   min: 1; max: 7),
     (faces: 8;   min: 1; max: 8),
     (faces: 10;  min: 1; max: 10),
     (faces: 12;  min: 1; max: 12),
     (faces: 16;  min: 1; max: 16),
     (faces: 20;  min: 1; max: 20),
     (faces: 24;  min: 1; max: 24),
     (faces: 30;  min: 1; max: 30),
     (faces: 34;  min: 1; max: 34),
     (faces: 50;  min: 1; max: 50),
     (faces: 100; min: 1; max: 100)
  );

function RandRange(const AFrom, ATo: Integer): Integer;
begin
  if AFrom > ATo then
    Result := Random(AFrom - ATo + 1) + ATo
  else
    Result := Random(ATo - AFrom + 1) + AFrom;
end;

function LaunchDe(const DT : TDesType; const ND: byte = 1): integer;
begin
  result := RandRange(DesDatas[DT].min*ND,
                      DesDatas[DT].max*ND);
end;

initialization
  Randomize;

end.
// couper ici --8<---------------------------------------------------- //
 


contient tout les des (ou presque) standards et speciaux

a utiliser comme suit :

Lc := LaunchDe(dtD6);        // 1D6    [1..6]
Lc := LaunchDe(dtD20, 2);    // 2D20   [2..40]
Lc := LaunchDe(dtD8, 2)+6;   // 2D8+6  [8..22]
Lc := LaunchDe(dtD100, 3);   // 3D100  [3..300]
Lc := LaunchDe(dtD10,2)-2;   // 2D10-2 [0..18]

ou encore :

case LaunchDe(dtD20) of
  1..10  : ActEchec;
  11..17 : ActNormal;
  18..19 : ActPerfect;
  20     : ActMaladresse;
end;

case LaunchDe(dtD6,3) of
    3 : PeonDestiny;
    9 : RoyalDestiny;
   12 : KnightDestiny;
   15 : DivineDestiny;
   18 : EvilDestiny;
  else
    NormalDestiny;
end;





Re : Problème d'aléatoire le 14/05/2008 22:21:15

JulioDelphi
Membre Club
(Admin CS)
Excellent foxi :) Mais artmonchrie2 (sans vouloir être vexant) a t-il le niveau pour comprendre sans explications ?

Art:
Tu peux modifier ça :
function DE(nombre : integer):integer;
var
  Nb : integer;
 
begin
  randomize;
  if nombre = 100
  then
    Nb := random(100)   //On considère que le dé 100 va de 00 à 99
  else
    Nb := random(nombre)+1;

  DE := Nb;
end;

en ça :
Function De(const Nombre: integer): integer;
begin
 if Nombre=100 then Result := Random(100) else
  Result := Random(Nombre)+1;
end;
Pour la deuxième fonction, efface là et recommence là depuis 0 :p ... ou utiliser les dés de foxi =)

Re : Problème d'aléatoire le 15/05/2008 14:49:30

f0xi
Membre Club
(Admin CS)
"sans vouloir être vexant) a t-il le niveau pour comprendre sans explications ? "


le code, pas forcement, mais il verra vite de quoi il s'agit si il s'y connait en JDR.

moi quand je vois 1D6 ou 3D4 je pense JDR tout de suite, épée d'elfe rouge+8 et jets critique.
huhuhu

donc la, 1 fonction, 2 parametres (1 facultatif) ... y'a pas plus simple.




Re : Problème d'aléatoire le 15/05/2008 15:06:18

JulioDelphi
Membre Club
(Admin CS)
J'avoue, même moi qui suis pas un "pro" JDR, j'ai tout de suite vu que c'était ça. Génial !

Re : Problème d'aléatoire le 15/05/2008 18:37:42

artmonchrie2
Merci pour ton code Foxi, mais ça ne réponds pas vraiment à ma question. Je vois que ton générateur de dé est plus puissant (déjà il lance plusieurs dés à la fois ^^) mais le mien marche quand même. En plus je m'en sers déjà bcp dans le reste du générateur et il marche trés bien! Donc si je pouvais éviter de tout reprendre !
J'ai fait quelques nouveaux tests dont voici les résultats :
si je rajoute pas mal d'opérations entres les différents appels de dé (ex rendre visible puis invisible moultes fois un composant) y a de l'amélioration, le D3 n'a plus toujours la même valeur, par contre il n'en prends que deux différentes à chaque fois... (j'ai jamais eu de 1, 2 et 3 ... etc en un tirage...) louche..
et par contre si aprés chaque résultat j'affiche le résultat avec un showmessage, ça passe impec... trés louche j'ai a chaque fois un résultat qui semble vraiment aléatoire.

D'où ça peut venir ?

Ptite question en plus, ça sert à quoi de mettre "const" dans l'entete de la fonction avant "Nombre : integer"

Re : Problème d'aléatoire le 15/05/2008 18:47:28

artmonchrie2
J'ai trouvé...

Trop pourrie la solution,

j'ai changé le randomize de place, je l'ai appelé une seule fois dans le programme principal et plus du tout dans la fonction DE. Je ne sais pas pourquoi, mais depuis ça marche, même sans intercaller la moindre action intermédiaire..

En tout cas merci à vous deux pour votre aide


Classé sous : nombre, var, integer, dés, score

Participer à cet échange

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Redaction texte pour s...
Budget : 180€
Travail graphique- ill...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS