Option RANDOM Delphi

florian060190 Messages postés 21 Date d'inscription mardi 11 août 2009 Statut Membre Dernière intervention 27 décembre 2014 - 4 avril 2009 à 14:37
 Anonymous340 - 30 mars 2015 à 16:04
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

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 15:36
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 !
0
florian060190 Messages postés 21 Date d'inscription mardi 11 août 2009 Statut Membre Dernière intervention 27 décembre 2014
4 avril 2009 à 16:10
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.
0
florian060190 Messages postés 21 Date d'inscription mardi 11 août 2009 Statut Membre Dernière intervention 27 décembre 2014
4 avril 2009 à 16:11
Ci dessous en fait :)
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 16:25
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 !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florian060190 Messages postés 21 Date d'inscription mardi 11 août 2009 Statut Membre Dernière intervention 27 décembre 2014
4 avril 2009 à 16:27
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.
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 16:28
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 !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 16:30
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 !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 16:32
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 !
0
florian060190 Messages postés 21 Date d'inscription mardi 11 août 2009 Statut Membre Dernière intervention 27 décembre 2014
4 avril 2009 à 16:32
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 ;)
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 16:34
Héhé j'ai trouvé avant toi :D

Cordialement, Bacterius !
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 16:36
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 !
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 avril 2009 à 19:16
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%" />
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
4 avril 2009 à 19:23
Euh oui on a oublié le randomize au début il est essentiel ^^
Merci f0xi :)

Cordialement, Bacterius !
0
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
5 avril 2009 à 19:51
et puis le code de foxy évite de tomber 2 fois de suite sur la même personne ;)
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
5 avril 2009 à 20:00
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 !
0
Anonymous340
30 mars 2015 à 16:04
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 ?
0
Rejoignez-nous