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

WinDev Discussion :

Fonction Hasard [WD10]


Sujet :

WinDev

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 112
    Points : 45
    Points
    45
    Par défaut Fonction Hasard
    Bonjour,
    J'utilise la fonction Hasard pour générer des nombres aléatoirement entre 1 et 95 : Hasard(1,95)
    Seulement voilà, j'ai besoin de votre aide car lorsque j'appelle la fonction, il m'arrive d'avoir le même numéro alors que je voudrais qu'ils sortent 1 seule fois et de manière aléatoire.
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Hasard ne traite pas directement votre besoin.

    Conservez dans un tableau les numéros déjà tirés et, lors des tirages, ne pas utiliser ceux qui sont déjà tirés.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Si tu ne veux pas avoir deux fois le même numéro, il te faut stocket tous les chiffres dans un tableau, et à chaque "tirage":
    1. tu prends un numéro au hasard entre 1 et dimension(tontableau)
    2. tu supprimes le numéro que tu viens de prendre (tableausupprime)

    Ainsi chaque numéro ne sortira qu'une seule fois. Par contre après 95 tirages tu n'auras plus rien !

    Tatayo.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 112
    Points : 45
    Points
    45
    Par défaut
    Peux-tu me faire un exemple, tatayo, car c'est encore un peu complexe ?
    Merci d'avance

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    On ne fera pas ton code, c'est contraire aux principes d'aide du forum.
    On t'as déjà donné un pseudocode, le reste te revient.

    Pour obte,ir une liste de n numéros différentes, tu dois :
    1. générer un premier nombre
    2. stocker ce nombre dans une liste
      1. générer un nième nombre
      2. comparer à la liste
      3. le stocker s'il en est absent
      4. revenir au 2/1 jusqu'à ce que tu aies la quantité de nombres désirée

  6. #6
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Bonjour

    Ne pas oublier d'utiliser InitHasard

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 112
    Points : 45
    Points
    45
    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
     
    InitHasard()
     
    // code enregistrement aléatoire
    nNbre est un entier = Hasard(1,95)
     
    ListeAjoute(LISTE_Imagerie,nNbre)
     
    	cpt est un entier
    	ResCherche est un entier
    	ResCherche = ListeCherche(LISTE_Imagerie,nNbre,Faux)
     
    	TANTQUE ResCherche <> -1
    		cpt++
    		// Recherche de nNbre dans la liste
    		ResCherche = ListeCherche(LISTE_Imagerie, nNbre, Faux, ResCherche+1)
     
    	FIN
    J'ai mis ce code sur un bouton et je constate qu'un même nombre peut ressortir.
    Merci d'avance

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    As-tu tracé ton code ?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Citation Envoyé par COLOMBAT Voir le message
    Peux-tu me faire un exemple, tatayo, car c'est encore un peu complexe ?
    Merci d'avance
    Comme le dit Gardian, je ne te donnerai pas le code complet.
    D'ailleurs, polItique du forum ou pas, je préfère guider vers une solution que la donner, mais voici quand même comment je ferai:

    1. Déclaration d'un tableau de 95 entiers
    2. Remplissage avec une simple boucle du tableau, avec les entiers de 1 a 95

    Ensuite quand tu veux un nombre:
    1. Tu prends avec Hasard() un nombre entre 1 et dimension(TonTableau). C'est l'indice du nombre que tu veux
    2. Tu lis dans le tableau, à l'indice tiré au sort précédemment, la valeur du tableau. C'est le chiffre qui est réellement tiré au hasard
    3. Tu supprimes la case du tableau que tu vient de lire

    Ainsi, vu que tu supprimes à chaque fois le nombre que tu viens de tirer au sort, impossible d'avoir 2 fois le même chiffre.

    Il ne te reste plus qu'à coder le tout

    Tatayo.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Citation Envoyé par tatayo Voir le message
    D'ailleurs, polItique du forum ou pas, je préfère guider vers une solution que la donner
    C'est évidemment pour des raisons didactiques, nous sommes d'accord sur cet aspect je pense

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 112
    Points : 45
    Points
    45
    Par défaut
    Voici mon code en fonction de ton algorithme, tatayo :
    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
    24
    25
    26
    27
    nNombre est un entier = 1
     
    POUR nNombre = 1 A 95
    	Trace("nNombre= " + nNombre)
    	TableAjoute(TABLE_Imagerie1,nNombre)
    FIN
     
    	InitHasard()
     
    	cpt est un entier = 0
    	ResCherche est un entier
    	Dim est un entier = TABLE_Imagerie1..Occurrence
     
    BOUCLE
    	nNbre1 est un entier = Hasard(1,Dim)
    	ResCherche = TableCherche(TABLE_Imagerie1.COL_Nbre,nNbre1)
     
    	SI ResCherche <> -1 ALORS
    		cpt++
    		TableSupprime(TABLE_Imagerie1,nNbre1)
    	FIN	
     
     
    	SI cpt > 95 ALORS
    		RETOUR
    	FIN
    FIN
    Et l'erreur qu'il me retourne :


    Merci d'avance pour votre aide.

  12. #12
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Bonjour,

    Il faut que tu réinitialise Dim dans ta boucle.
    Sinon Dim vaut toujours 95.
    (Après la commande TableSupprime du remet
    Dim = TABLE_Imagerie1..Occurrence)
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  13. #13
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Il faut aussi faire attention.
    D'après ton code tu n'exploite pas la valeur que tu trouve dans ta table TABLE_Imagerie1.

    Ensuite tu initialise à chaque appel ta table TABLE_Imagerie1 avec les 95 valeurs possibles.

    Je ne sais pas si c'est voulu, ou si c'est pour ne pas mettre tout ton code
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 112
    Points : 45
    Points
    45
    Par défaut
    Merci pour ton aide mail.spam.
    Néanmoins, en remettant Dim = TABLE_Imagerie1..Occurrence après le TableSupprime, je constate que le programme fait une boucle infinie.
    L'initialisation de la table est volontaire.

    En plus de ce que tu m'as dit, je constate qu'il y a encore tirage de nombres qui sont déjà sortis.
    Est-ce normal ?

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Bon, moi je ne ferais pas comme cela, mais plutôt ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	InitHasard()
     
    //	cpt est un entier = 0
            nNbre1 est un entier
    	ResCherche est un entier
    //	Dim est un entier = TABLE_Imagerie1..Occurrence
     
    Tantque TABLE_Imagerie1..occurrence > 0
    	nNbre1 est un entier = Hasard(1,Table_Imagerie1..occurrence)
    	ResCherche = COL_Nbre[nNbre1]
            Info(ResCherche)
    	TableSupprime(TABLE_Imagerie1,nNbre1)
    FIN

  16. #16
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Pour la boucle infini c'est normale car Cpt ne vaudra jamais plus de 95
    il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SI cpt >= 95 ALORS
    		RETOUR
    	FIN
    Ensuite comme tu initialise la table à chaque fois tu remet les valeurs déjà prise.

    Je vais te donner un code

    tu met ce code dans l'initialisation de ta fenêtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Tab_Indice est tableau d'entiers
    NbValeurPossible est entier = 95
    //	initialisation du tableau pour le tirage au sort
    POUR i = 1 A NbValeurPossible
    	TableauAjouteLigne(Tab_Indice,i)
    FIN
    Ensuite dans le code de ton bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ValHasard est entier
    IdHasard est entier
    InitHasard()
    SI Tab_Indice..Occurrence > 0 ALORS
    	IdHasard = Hasard(1,Tab_Indice..Occurrence)
    	ValHasard = Tab_Indice[IdHasard]
    	TableauSupprimeLigne(Tab_Indice,IdHasard)
    SINON
    	Erreur("Plus de choix possible")
    	ValHasard = 0
    FIN
    Trace(ValHasard)
    Ainsi tu as une liste de NbValeurPossible quand tu ouvre ta fenêtre
    Puis à chaque appuis sur le boutons tu ne retourne qu'une valeur qui ne peux plus être utiliser
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 112
    Points : 45
    Points
    45
    Par défaut
    J'ai appliqué ton code mail.spam et ça marche très bien !
    Merci aussi Louis Griffont pour ta contribution.
    Sujet résolu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Fonction de choix d'un nombre au hasard
    Par tickerdu22 dans le forum Langage
    Réponses: 7
    Dernier message: 15/01/2008, 18h44
  2. Fonction paire au hasard
    Par poupasol dans le forum Scheme
    Réponses: 5
    Dernier message: 28/12/2007, 18h36
  3. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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