florian060190
Messages postés21Date d'inscriptionmardi 11 août 2009StatutMembreDernière intervention27 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.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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 ^^
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.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
florian060190
Messages postés21Date d'inscriptionmardi 11 août 2009StatutMembreDernière intervention27 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.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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).
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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 ^^
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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 ^^
for I := 0 to MaxLines-1 do
begin
Index := Random(MaxNames);
while Index = LastIndex do
Index := Random(MaxNames);
LastIndex := Index;
WriteLn(
MyNames[index]
);
end;
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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 ...