CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[Delphi] Fonction Randomize

1326
1326
Niveau 7
30 novembre 2008 à 15:28:29

Bonjour tout le monde, je sollicite votre aide car j'ai un petit problème. Explication:
Pour les cours j'ai un programme avec deux quizz à réaliser.
L'utilisateur saisit les données (pays, capitale et monnaie), je les mets dans un tableau en mémoire puis envoie le tout sur une autre page dans un tableau (StringGrid) pour que l'utilisateur puisse voir ce qu'il a saisit.
Ensuite, s'il joue aux quizz, j'utilise la fonction randomize pour faire choisir un pays aléatoire, mais mon problème est qu'il y a 5 questions et qu'un pays ne doit pas revenir plusieurs fois, or je ne sais pas comment faire pour exclure les pays déjà tirés.

J'avais pensé supprimé le pays du tableau, sauf que le joueur doit pouvoir revenir au tableau pour pourquoi pas rajouter un autre pays, donc je ne peux pas me permettre de le supprimer.
Du coup j'avais imaginé mettre les données saisie par l'utilisateur dans un 2ème tableau en mémoire, et utiliser celui-ci pour supprimer les pays déjà tirés, mais je pense qu'il existe une solution plus simple.

Merci de votre aide :)

ps: je suis pas sûr d'être très clair dans mes explications :s

godrik
godrik
Niveau 30
30 novembre 2008 à 15:40:52

La question me parait claire, elle revient a se demander:
comment tirer k nombres aléatoire différent dans l'intervalle [1:n] ?

La réponse dépend du ratio entre k et n.
Si il est faible la solution suivante est parfaitement acceptable:
A chaque tirage, on vérifie que le nombre n'a pas déja été tiré. Si il l'a été, on tire un autre nombre.

Cette solution est rapide a implementé et efficace si le ratio k/n est faible, le nombre de tirage perdu est alors faible.

Si le ratio k/n est elevé, il faut faire autrement. Une solution acceptable serait de tirer a l'etape i entre 1 et n-i, et de calculer quel est la n-i eme premiere valeure non tiré.

Note: il faut dans ces deux méthodes stocker la liste des nombres déjà tiré.

1326
1326
Niveau 7
30 novembre 2008 à 17:50:15

Tout d'abord, merci pour la réponse.

Je crois voir où vous voulez en venir.
Dans mon programme, k = nombre de tirage = 5 et n = nombre d'enregistrement = 25.
Jusque là je pense que c'est bon.
Ensuite j'ai un doute, est-ce cela que vous me dites de faire ? :
Je tire un nombre aléatoire, de ce nombre j'en sort un pays. Je mets ce pays dans un tableau.
Je tire un autre nombre aléatoire, de ce nombre j'en sort un autre pays. Je compare ce pays avec celui précédemment trouvé. Si le pays est différent alors je le mets sur la 2ème ligne sinon je retire un nouveau nombre qui me donne un autre pays que je compare au premier pays tiré.
Et ainsi de suite jusqu'à atteindre les 5 pays différents.

Si c'est le cas, j'ai du mal à voir comment l'écrire sous delphi.
J'arrive pas à voir comment enchainer les comparaisons. Je suis sûr de savoir faire mais là ça sort pas :(

1326
1326
Niveau 7
30 novembre 2008 à 18:04:27

En fait je crois avoir trouvé :

procedure TFrm_quizz_capitale.FormActivate(Sender: TObject);
Var
I :integer;

begin
I := 1;
For I := 1 to 5 do
begin
randomize ;
nbhasard := random(vnbpays+1) ;
lescapitales[I] := lespays[nbhasard];
end;
end;

Maintenant faut que je place mes vérifications là dedans, je devrais y arriver si je suis logique.

Par contre, petite question encore, comment faire pour que le randomize démarre à 1 et pas à 0 ?

dnob700
dnob700
Niveau 10
30 novembre 2008 à 19:43:46

avec ça :
nbhasard := random(vnbpays)+1;
au lieu de ça :
nbhasard := random(vnbpays+1);

1326
1326
Niveau 7
03 décembre 2008 à 14:12:22

:merci:

1326
1326
Niveau 7
03 décembre 2008 à 15:10:06

Finalement je reviens vers vous :(

J'ai beau lire et relire, tester et retester, je n'arrive pas à écrire mon code.
Je ne vous le demande pas, mais je souhaiterais de l'aide concernant la logique à employer, car c'est surtout ça qui me pose problème.

Je souhaiterais faire ça :
Je mets tous les pays dans un tableau en mémoire
Je cherche un premier nombre que je mets dans une variable V1
Je vérifie que le nombre est supérieur à 0.
Je supprime la ligne valant V1 dans le tableau en retirant 1 à mon nombre de pays
Je cherche V2 en m'assurant qu'il est supérieur à 0.
Je supprime V2 dans le tableau en mémoire.
Je cherche V3 en m'assurant qu'il est supérieur à 0.
Je supprime V3 dans le tableau en mémoire.
Je cherche V4 en m'assurant qu'il est supérieur à 0.
Je supprime V4 dans le tableau en mémoire.
Je cherche V5 en m'assurant qu'il est supérieur à 0.
Je supprime V5 dans le tableau en mémoire.

Sauf que j'arrive pas à le mettre en forme sous delphi. J'arrive pas à voir quelles structures utiliser, ni où les placer.
Quelques indications pour me mettre sur le bon chemin serait pratique pour moi.

Merci :)

dnob700
dnob700
Niveau 10
03 décembre 2008 à 18:30:12

quand tu retire 1 à ton nombre de pays, est-ce que tu pense à copier le dernier pays du tableau à la place où il y avait celui que tu viens d'enregistrer ?

Si oui, ça devrait fonctionner ton principe, mais il faut stocker les pays que tu choisis dans un tableau de 5 éléments et non pas dans 5 variables différentes. Et je ne comprend pas pourquoi tu vérifie que ton nombre est plus grand que 0. Soit ton tableau sont indéxés à partir de 0 et alors il ne faut pas faire ça, soit ils le sont à partir de 1 et alors tu génère un nombre aléatoire dans l'intervalle [1..nombre de pays].

1326
1326
Niveau 7
03 décembre 2008 à 19:42:28

La vérification je la faisais car ça marchait pas au début, j'ai repris mon code est ça marche maintenant, j'avais du faire une erreur à un endroit :s

Je copie la dernière ligne dans le tableau à la place de celui que j'ai sauvegardé. Mais ça ne fonctionne pas. Doit y avoir une erreur xd

procedure TFrm_quizz_capitale.FormActivate(Sender: TObject);
Var
V1, V2 : Integer;
V1bis, V2bis : Mot20;

Begin
randomize;
V1 := random(Vpays)+1;
V1bis := lescapitales[V1].pays;
za_pays.caption := V1bis;
While V1 < Vpays Do
Begin
lescapitales[V1] := lescapitales[V1 + 1];
V1 := V1 + 1;
Vpays := Vpays-1;
end;
randomize;
V2 := random(Vpays)+1;
V2bis := lescapitales[V2].pays;
za_pays2.caption := V2bis;
While V2 < Vpays Do
Begin
lescapitales[V2] := lescapitales[V2 + 1];
V2 := V2 + 1;
Vpays := Vpays-1;
end;
end;

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment