[R] Réindexer un tableau après une suppression de valeur
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
[R] Réindexer un tableau après une suppression de valeur
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.
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.
Re: [..] Réindexer un tableau après une suppression de valeu
Tu aurais un bout de code à nous montrer ?
Exemple avec le loto :
Exemple avec le loto :
► Afficher le texte
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
- jchd
- 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
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é.
Re: [..] Réindexer un tableau après une suppression de valeu
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)
Merci JC
Edit : finalement, j'avais utilisé un peu la même technique pour le challenge de la lotterie de Guinness (sans le savoir)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
- jchd
- 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
Oui, Knuth, en général ... 
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Re: [..] Réindexer un tableau après une suppression de valeu
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 ?
J'ai adapté le code de jguinch à mon programme : il est parfait !
Qu'est-ce que ce $iUniq magique ?
Re: [..] Réindexer un tableau après une suppression de valeu
Il sert juste à tester si le numéro à déjà été utilisé ou non.
Tu n'as pas compris le code ?
Tu n'as pas compris le code ?
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Re: [..] Réindexer un tableau après une suppression de valeu
Non !jguinch a écrit : Tu n'as pas compris le code ?
- mikell
- 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
Si tu remplaces "While NOT $iUniq" par "While $iUniq = False" c'est plus simple 

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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Re: [..] Réindexer un tableau après une suppression de valeu
Merci pour ces commentaires qui m'éclairent sur ce code excellent.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
- jchd
- 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
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.
L'algorithme proposé par Donald Knuth n'a pas ce problème.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Re: [R] Réindexer un tableau après une suppression de valeur
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.
- jchd
- 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
aulus,
Il n'empêche que l'algorithme du code posté par jguinch n'offre aucune garantie de fin en un temps borné.
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é.
- mikell
- 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
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
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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Re: [R] Réindexer un tableau après une suppression de valeur
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.
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 !
- jchd
- 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
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 !
"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é.
Re: [R] Réindexer un tableau après une suppression de valeur
Je vais tenter d'adapter la proposition de jchd à mon code pour voir comment ça se passe.
- mikell
- 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
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)
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 )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
- jchd
- 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
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...mikell a écrit :C'est l'intérêt d'utiliser SRandom(@AutoItPID) dans ton code que je ne comprends pas
Farpaitement. Mieux, même.d'ailleurs ton code fonctionne aussi sans ce SRandom
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.BTW la valeur donnée au param 'seed' a-t-elle une importance (à part celle de définir une reproductibilité propre à cette valeur)
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é.
- mikell
- 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
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
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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )


