Option RANDOM Delphi

Signaler
Messages postés
21
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
27 décembre 2014
-
 Anonymous340 -
Bonjour,
Je suis actuellement en train de réaliser un projet Algorithmique qu'il faudra ensuite executer sur Delphi.
Nous avons en cours appri l'outil RANDOM qui permet à l'ordinateur de déterminer des nombres entre par exemple 3 et 150.
Seulement, l'option qui m'intéresserait serait un RANDOM avec des choix en chaines de caractères donnés par l'utilisateur. Je ne sais pas trop si vous parvenez à me comprendre mais par exemple, si nous avons 35 noms de famille, on aimerait que l'option RANDOM nous en donne un au pif sur les 35 mais vu qu'il s'agit de chaines de caractères, je ne sais vraiment pas comment faire.
En vous remerciant.
Cordialement.

16 réponses

Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Facile : il te suffit d'associer à chaque chaîne de caractères, un nombre.
Utilise donc les tableau dynamiques (ou statiques). Regarde :

var
MesNoms: array [1..35] of String;
begin
// Je remplis mes noms ...
ShowMessage(MesNoms[random(35) + 1]);
// Je récupère un élément du tableau au hasard
end;

Ici, chaque élément du tableau contient une chaîne de caractère et est associé à un nombre, un index. Si tu choisis un nombre entre 1 et 35, et que tu prends la chaîne correspondante dans le tableau (MesNoms[Index]), tu auras un nom pris au pif :)
N'oublies pas que random tire un nombre entre 0 et "range" NON compris. Si tu veux faire entre 1 et 35, il faudra faire :

0 <= X < 35
1 <= X + 1 < 36
1 <= X + 1 <= 35

Donc, il faut faire random(35) + 1
Voilà :)
Et random sans paramètre renvoie un nombre décimal entre 0 et 1 ^^

Cordialement, Bacterius !
Messages postés
21
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
27 décembre 2014

http://img19.imageshack.us/my.php?image=erreurt.jpg

Merci de ton aide! Cependant, Delphi me trouve une erreur assez incompréhensible à l'execution. Je vois vraiment pas d'où vient ce problème avec ce "."  C'est rageant. (cf: regardez l'image ci dessus)
En espérant trouver quelqu'un qui trouve :s
Merci.
Messages postés
21
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
27 décembre 2014

Ci dessous en fait :)
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
C'est effectivement assez incompréhensible car tout semble bon dans ton code. Quelle version de Delphi as-tu ?
Pourrais-tu poster le code en copier-coller ici ? (ça marche aussi et ça évite les problèmes genre "c'est une virgule ça ?" "et ça c'est un crochet ou une parenthèse ?" ^^
On va bien voir d'où vient le problème :p

Cordialement, Bacterius !
Messages postés
21
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
27 décembre 2014

program RANDOM;
{$APPTYPE CONSOLE}
uses
  sysutils;


var  MesNoms:Array[1..5]of string;
Choix:String;
I:Integer ;


begin
MesNoms[1]:='Celine';
MesNoms[2]:='Vincent';
MesNoms[3]:='Goyon';
MesNoms[4]:='Pascaline';
MesNoms[5]:='Candice';
I:=1;
For I:=1 to 30 do
begin
Choix:=MesNoms[random(5) + 1];
Writeln(Choix);
end;
Readln;
end.
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Bon je suis sous Delphi 6, j'ai mis le code mot pour mot et ça a marché (au fait, le I := 1 avant la boucle for n'est pas nécessaire, Delphi s'occupe de ça automatiquement).

Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Ah effectivement ton code donne une erreur de compilation.
Essaye avec ce code :

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
MesNoms: array [1..5] of String;
Choix: String;
I: Integer;

begin
MesNoms[1] := 'Celine';
MesNoms[2] := 'Vincent';
MesNoms[3] := 'Goyon';
MesNoms[4] := 'Pascaline';
MesNoms[5] := 'Candice';
for I := 1 to 30 do
begin
Choix := MesNoms[random(5) + 1];
WriteLn(Choix);
end;
ReadLn;
end.

C'est le même mais il fonctionne chez moi ??
C'est peut-être un bug du compilateur, ou un truc qu'on n'arrive pas à voir.

Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Ah j'ai trouvé c'est tout bête : tu appelles ton programme "random" comme la fonction. Appelle-le autrement, ou bien utilise System.random.
Voili voilou ^^

Cordialement, Bacterius !
Messages postés
21
Date d'inscription
mardi 11 août 2009
Statut
Membre
Dernière intervention
27 décembre 2014

Tu vas rire.


Je viens de trouver l'erreur


L'erreur réside dans le fait où il est notamment INTERDIT de nommer un .dpr RANDOM, ça détraque tout.


COmment perdre une heure de travail ;)


Merci de ton attention en tout cas ;)
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Héhé j'ai trouvé avant toi :D

Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Et ça n'est pas INTERDIT de nommer un projet random, il faut alors juste préciser l'unité dans laquelle se trouve la fonction (comme System.random), pour le compilateur sache de quoi tu parles ^^

Cordialement, Bacterius !
Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
28
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var

  I, Index, LastIndex: Integer;
 
const
  MaxLines : integer = 30;
  MaxNames : integer = 5;



  MyNames : array [0..MaxNames-1] of String =(

    'Celine',
    'Vincent',
    'Goyon',
    'Pascaline',
    'Candice'

  );

begin
  Randomize;
  LastIndex := -1;

  for I := 0 to MaxLines-1 do
  begin
    Index := Random(MaxNames);
    while Index = LastIndex do
     Index := Random(MaxNames);
    LastIndex := Index;
    WriteLn(
MyNames[index]
);
  end;

  ReadLn;
end.




<hr size="2" width="100%" />
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Euh oui on a oublié le randomize au début il est essentiel ^^
Merci f0xi :)

Cordialement, Bacterius !
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
et puis le code de foxy évite de tomber 2 fois de suite sur la même personne ;)
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
De plus, oui ^^
On pourrait même faire en sorte de ne tomber qu'une seule fois sur la même personne ... dans ce cas-là ça ferait comme si l'on avait mélangé la liste et envoyé un par un ...

Cordialement, Bacterius !

Bonjour

J'ai copier/coller


uses
SysUtils;

var
MesNoms: array [1..5] of String;
Choix: String;
I: Integer;

begin
MesNoms[1] := 'Celine';
MesNoms[2] := 'Vincent';
MesNoms[3] := 'Goyon';
MesNoms[4] := 'Pascaline';
MesNoms[5] := 'Candice';
for I := 1 to 30 do
begin
Choix := MesNoms[random(5) + 1];
WriteLn(Choix);
end;
ReadLn;
end.


Mais ça me met
[Erreur] Project2.dpr(20): '.' attendu(e) mais '(' trouvé(e)

Et le curseur se positionne vers le 5

Que faire SVP ?