[R] Réindexer un tableau après une suppression de valeur

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

[R] Réindexer un tableau après une suppression de valeur

#1

Message par aulus »

Bonjour,

Mon programme tire au hasard, par la fonction Random, une valeur dans un tableau, puis l'affiche.
Afin que la fonction ne tire pas plusieurs fois la même valeur, je pense supprimer cette valeur par _ArrayDelete($tableau, $i), $i étant son indice.
Je voudrais alors réindexer le tableau afin de poursuivre le tirage sans que la fonction Random tombe sur un indice détruit. J'ai parcouru en vain la liste des fonctions contenues dans Array.au3. Existe-t-elle ? Sinon comment faudrait-il s'y prendre ?

Je vous remercie.
Modifié en dernier par aulus le dim. 20 juil. 2014 17:33, modifié 1 fois.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#2

Message par jguinch »

Tu aurais un bout de code à nous montrer ?

Exemple avec le loto :
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#3

Message par jchd »

La méthode générale la plus efficace est postée ici.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#4

Message par jguinch »

Vraiment bien l'algo, c'est simple mais super efficace !
Merci JC

Edit : finalement, j'avais utilisé un peu la même technique pour le challenge de la lotterie de Guinness (sans le savoir) :roll:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#5

Message par jchd »

Oui, Knuth, en général ... :idea:
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#6

Message par aulus »

D'abord merci à tous pour vos réponses.
J'ai adapté le code de jguinch à mon programme : il est parfait !
Qu'est-ce que ce $iUniq magique ?
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#7

Message par jguinch »

Il sert juste à tester si le numéro à déjà été utilisé ou non.
Tu n'as pas compris le code ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#8

Message par aulus »

jguinch a écrit : Tu n'as pas compris le code ?
Non ! :( je ne comprends pas comment ce $iUniq fait le travail.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#9

Message par mikell »

Si tu remplaces "While NOT $iUniq" par "While $iUniq = False" c'est plus simple Image

Code : Tout sélectionner

For $j = 1 To $iNumbers     ; de 1 à 7
    [color=#BF0000]$iUniq = False[/color]
    While NOT $iUniq    ; [color=#BF0000]tant que $iUniq=false[/color]
        $iRand = Random($iMin, $iMax, 1)     ; choisit un nombre
        If NOT StringInStr($sRandom, ";" & $iRand & ";") Then   ; si le nombre n'est pas déjà tiré (pas dans la liste)
            $sRandom &= $iRand & ";"   ; rajoute le nombre à la liste
            $iUniq = True   ; et [color=#BF0000]fait sortir de la boucle while[/color]
        EndIf
    WEnd   
Next
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [..] Réindexer un tableau après une suppression de valeu

#10

Message par aulus »

mikell a écrit :     While NOT $iUniq    ; tant que $iUniq=false
         If NOT StringInStr($sRandom, ";" & $iRand & ";") Then   ; si le nombre n'est pas déjà tiré (pas dans la liste)
              $iUniq = True   ; et fait sortir de la boucle while
Merci pour ces commentaires qui m'éclairent sur ce code excellent.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#11

Message par jchd »

Le problème avec le code proposé est qu'il n'est pas déterministe ce qui fait qu'il peut mettre un temps non borné à se terminer, même si la probabilité d'une telle éventualité est faible.

L'algorithme proposé par Donald Knuth n'a pas ce problème.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#12

Message par aulus »

La question ne se posera pas pour mon programme du fait que c'est l'utilisateur qui décidera de mettre fin au programme. En effet, lorsque toutes les valeurs du tirage auront été appelées (pour afficher les valeurs d'un tableau), le programme crée un nouveau tirage pour représenter à nouveau toutes les valeurs du tableau, mais dans un ordre différent. Et cela à l'infini, tant que l'utilisateur ne fermera pas le programme.
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#13

Message par jchd »

aulus,

Il n'empêche que l'algorithme du code posté par jguinch n'offre aucune garantie de fin en un temps borné.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#14

Message par mikell »

jc tu as raison, mais on préfère généralement utiliser un code qu'on comprend et j'imagine que c'est le cas pour aulus
Personnellement je comprends pas SRandom(), son intérêt et à quoi ça sert, l' "explication" du fichier d'aide étant parfaitement hermétique et le script d'exemple d'une valeur pédagogique nulle
Mais suis-je bête, "Durstenfeld variant of the Fisher–Yates algorithm" c'est pourtant limpide :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#15

Message par jguinch »

Complètement d'accord avec toi JC.
Aulus, même si mon code répond à ton besoin, je te conseille de regarder celui de jchd sur le forum US (voir lien plus haut). Il n'est pas trop compliqué à comprendre et te montrera une autre façon de faire.
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#16

Message par jchd »

SRandom est littéralement SeedRandom et permet d'initialiser le PRGN (générateur de nombres pseudo-aléatoires) dans un état reproductible à des fins de test généralement. Sinon Random utilise des sources pseudo-aléatoires disponibles dans le système pour démarrer dans un état inconnu à chaque premier emploi.

"Durstenfeld variant of the Fisher–Yates algorithm" je n'y peux rien, c'est le nom de cette variante. C'est plus pour citer une source vérifiable que pour étaler la confiture, bien que peu d'utilisateurs iront se précipiter sur TAOCP pour vérifier !
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
aulus
Niveau 7
Niveau 7
Messages : 424
Enregistré le : lun. 25 mars 2013 19:38
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#17

Message par aulus »

Je vais tenter d'adapter la proposition de jchd à mon code pour voir comment ça se passe.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#18

Message par mikell »

jc
C'est l'intérêt d'utiliser SRandom(@AutoItPID) dans ton code que je ne comprends pas
SRandom(int) permet de reproduire des séquences aléatoires à l'identique, ok, mais SRandom(@AutoItPID) autorise des séquences différentes et d'ailleurs ton code fonctionne aussi sans ce SRandom

BTW la valeur donnée au param 'seed' a-t-elle une importance (à part celle de définir une reproductibilité propre à cette valeur)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#19

Message par jchd »

mikell a écrit :C'est l'intérêt d'utiliser SRandom(@AutoItPID) dans ton code que je ne comprends pas
Euh, t'inquiète pas : moi non plus ! Je ne sais plus du tout pourquoi j'ai mis et surtout laissé ça là. Peut-$etre pour un vague test dont je n'ai plus souvenance...
d'ailleurs ton code fonctionne aussi sans ce SRandom
Farpaitement. Mieux, même.
BTW la valeur donnée au param 'seed' a-t-elle une importance (à part celle de définir une reproductibilité propre à cette valeur)
Elle initialise le générateur à un point donné dans sa titanesque séquence. A part ça, elle a autant de signification en elle-même qu'un MD5, c'est-à-dire aucune.

Pardon à tous d'avoir semé le trouble avec cette instruction idiote qui n'a rien à faire là.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] Réindexer un tableau après une suppression de valeur

#20

Message par mikell »

Aaaah merci jc
J'ai eu un instant de détresse devant ce SRandom(@AutoItPID) paradoxal préconisé par Yashield dans le topic US...
Mes neurones restants peuvent maintenant se rendormir tranquilles Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre