Page 1 sur 2
[R] Réindexer un tableau après une suppression de valeur
Posté : sam. 19 juil. 2014 20:50
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.
Re: [..] Réindexer un tableau après une suppression de valeu
Posté : sam. 19 juil. 2014 22:04
par jguinch
Tu aurais un bout de code à nous montrer ?
Exemple avec le loto :
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3> ; uniquement pour _ArrayDisplay
Local $iMin = 1 ; minimum = 1
Local $iMax = 49 ; maximlum = 49
Local $iNumbers = 7 ; nombre de chiffres à choisir
Local $sRandom = ";", $iUniq, $iRand
For $j = 1 To $iNumbers
$iUniq = False
While NOT $iUniq
$iRand = Random($iMin, $iMax, 1)
If NOT StringInStr($sRandom, ";" & $iRand & ";") Then
$iUniq = True
$sRandom &= $iRand & ";"
EndIf
WEnd
Next
Local $aRandom = StringRegExp($sRandom, "(\d+)", 3)
_ArrayDisplay($aRandom)
Re: [..] Réindexer un tableau après une suppression de valeu
Posté : sam. 19 juil. 2014 22:12
par jchd
La méthode générale la plus efficace
est postée ici.
Re: [..] Réindexer un tableau après une suppression de valeu
Posté : sam. 19 juil. 2014 22:22
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)

Re: [..] Réindexer un tableau après une suppression de valeu
Posté : sam. 19 juil. 2014 22:32
par jchd
Oui, Knuth, en général ...

Re: [..] Réindexer un tableau après une suppression de valeu
Posté : dim. 20 juil. 2014 10:14
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 ?
Re: [..] Réindexer un tableau après une suppression de valeu
Posté : dim. 20 juil. 2014 11:11
par jguinch
Il sert juste à tester si le numéro à déjà été utilisé ou non.
Tu n'as pas compris le code ?
Re: [..] Réindexer un tableau après une suppression de valeu
Posté : dim. 20 juil. 2014 14:51
par aulus
jguinch a écrit :
Tu n'as pas compris le code ?
Non !

je ne comprends pas comment ce $iUniq fait le travail.
Re: [..] Réindexer un tableau après une suppression de valeu
Posté : dim. 20 juil. 2014 15:47
par mikell
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
Re: [..] Réindexer un tableau après une suppression de valeu
Posté : dim. 20 juil. 2014 17:32
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.
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : dim. 20 juil. 2014 18:20
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.
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : dim. 20 juil. 2014 20:07
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.
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : dim. 20 juil. 2014 20:53
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é.
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : dim. 20 juil. 2014 21:27
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

Re: [R] Réindexer un tableau après une suppression de valeur
Posté : dim. 20 juil. 2014 21:32
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.
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : dim. 20 juil. 2014 22:47
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 !
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : lun. 21 juil. 2014 07:41
par aulus
Je vais tenter d'adapter la proposition de jchd à mon code pour voir comment ça se passe.
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : lun. 21 juil. 2014 11:53
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)
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : lun. 21 juil. 2014 12:24
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à.
Re: [R] Réindexer un tableau après une suppression de valeur
Posté : lun. 21 juil. 2014 12:54
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
