IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

la fonction random


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 47
    Points
    47
    Par défaut la fonction random
    bon jour a ts

    j'ai 2 edit ( 1 et 2 )

    je veux afficher le mot qui se stouve dans edit1 aléatoire dans edit2

    exempl: edit1='yacine' donc edit2 sera aficher 'ceiyna'

    c'est a dir lorsque je clique sur le bouton il me donne le mot aléatoir

    voila le code source

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i: integer;
    a:string;
    begin
    a:=edit1.Text;
    for i:=1 to length(a)
     do begin
          edit2.Text:=random(edit2.text);
        end;
     
    end.

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    procedure TForm1.Button1Click(Sender: TObject);
    const
      CaractereDejaReplace = '*';
    var
      i : integer;
      a : string;
    begin
      Randomize();
      a := edit1.Text;
      edit2.text := a;
      for i:=1 to length(a)
      do begin
        j := random(1, length(a));
        while a[j]<>CaractereDejaReplace do
          j := random(1, length(a));
    
        edit2.text[i] := a[j];
        a[j] := CaractereDejaReplace;
      end;
    end;
    Tout d'abord il faut utiliser Randomize();

    Bon évidemment il faudrait d'abord voir si CaractereDejaReplace n'appartient pas à edit1.Text et si c'est la cas alors il faudra le modifier.


    Ensuite test ce petit bout de code
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 47
    Points
    47
    Par défaut
    je te remrci, mais la variable ( J ) c'est quoi sont type car elle n'est pas déclarer

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    j est un integer
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  5. #5
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 47
    Points
    47
    Par défaut
    il m'affiche un probléme le voila: (expected but ',' fond) sur cette instruction

    j := random(1, length(a));

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Remplace les Random par des RandomRange.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  7. #7
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par 21247692 Voir le message
    je te remrci, mais la variable ( J ) c'est quoi sont type car elle n'est pas déclarer
    Ouh là, attention à bien utiliser tous le clavier et en particulier



    [Delphi] function Random(const ARange: Integer): Integer; overload;

    D'ailleurs, je pense qu'il vaut mieux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      j := random(length(a)) + 1;
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  8. #8
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Remplace les Random par des RandomRange.
    Oui c'est aussi une solution mais il faudra faire quand même attention aux bornes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      j := randomRange(1, length(a) -1 );
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Yurck Voir le message
    Oui c'est aussi une solution mais il faudra faire quand même attention aux bornes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      j := randomRange(1, length(a) -1 );
    Mmmh non je ne pense pas qu'il faille enlever -1 car le tableau de caractères de la chaîne est en base 1 et non pas en base 0 Donc a[length(a)] renvoi bien le dernier caractère de la chaîne.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  10. #10
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Mmmh non je ne pense pas qu'il faille enlever -1 car le tableau de caractères de la chaîne est en base 1 et non pas en base 0 Donc a[length(a)] renvoi bien le dernier caractère de la chaîne.
    +1
    Mais oui bien sûr
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  11. #11
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 47
    Points
    47
    Par défaut
    il affiche encor un probléme le voila ' left side cannot be assigned to '

    sur cette instruction ( edit2.text[i]:= a[j]; )

  12. #12
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    passe par une variable temporaire que tu affecteras en fin de procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure TForm1.Button1Click(Sender: TObject);
    const
      CaractereDejaReplace = '*';
    var
      i, j : integer;
      a, b : string;
    begin
      Randomize();
    
      a := edit1.Text;
      b := a;
      for i:=1 to length(a)
      do begin
        j := randomRange(1, length(a));
        while a[j]<>CaractereDejaReplace do
          j := random(1, length(a));
    
        b[i] := a[j];
        a[j] := CaractereDejaReplace;
      end;
      edit2.text := b;
    end;
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  13. #13
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Tout ça me rappelle le problème du : Comment mélanger un jeu de cartes.

    Un jour, j'avais lu un article d'un mec qui expliquait que pour faire le mélange correctement, il ne fallait pas procéder de cette façon :
    1. Premièrement, si la chaîne est un peu longue, le temps de traitement à toutes les chances de tendre vers l'infini. Lorsque tu avances dans les remplacements, le nombre de caractères qui n'ont pas été déjà remplacés va vite diminué. Donc lorsqu'on fait le deuxième random, la probabilité de tirer un caractère non remplacé va baisser tout aussi rapidement. Sur une chaine de 10 caractères, lorsque tu as traités les 9 premiers, il ne reste plus qu'une seule possibilité pour choisir le dernier caractère. Cependant avec cet algorithme, on va boucler jusqu'à ce que par chance, le tirage aléatoire tombe sur cette valeur. Sur 10 caractères, à la fin on a une chance sur 10. Sur 52, à la fin on a une chance sur 52... Au final, a vu de nez je dirais que cet algo va se comporter en O(n!).

    2. Le mec faisait une savante démonstration avec un calcul de combinatoire pour montrer qu'avec un mélange bien fait, on a n! résultats possibles (le nombre d'arrangements des caractères). Hors avec cet algorithme, il disait que le résultat était différent (ne me demandé pas pourquoi, j'ai pas tout compris).

    En fait, on évite tous ces problèmes en travaillant un rien différemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    procedure TForm3.Button4Click(Sender: TObject);
    var
      s : string;
      i, j : integer;
      c : char;
    begin
      randomize;
      s := Edit1.Text;
      for i := length(s) downto 1 do
      begin
        // On va remplacer le caractère i par un des caractères précédent choisi aléatoirement.
        j := random(i-1)+1;
     
        // On fait la permutation.
        c := s[j];
        s[j] := s[i];
        s[i] := c;
      end;
      Edit2.Text := s;
    end;
    De cette façon, on ne fait qu'un seul tirage pour chaque caractère de la chaîne. L'algo se comporte donc en O(n) et pas O(n!) ce qui n'est pas négligeable.
    De plus, pour le premier caractère, on fait un tirage parmi n.
    Pour le deuxième caractère, on fait un tirage parmi n-1.
    ....
    Pour le dernier caractère, il ne reste plus qu'une seule possibilité.

    Le nombre de résutlats possible est exactement n! (avec n=length(Edit1.Text) bien sûr !).

  14. #14
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Très bon, je le note.
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

Discussions similaires

  1. [Forth] Fonction random
    Par kamfezz dans le forum Autres langages
    Réponses: 3
    Dernier message: 16/04/2023, 14h33
  2. [Fortran 77] Fonction random
    Par ajsd0208 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/07/2005, 12h58
  3. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 14h20
  4. [LG]Fonction random
    Par platoon5 dans le forum Langage
    Réponses: 16
    Dernier message: 22/02/2005, 20h47
  5. Fonction Random en Assembleur
    Par chidi dans le forum Assembleur
    Réponses: 5
    Dernier message: 21/05/2004, 10h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo