[Func] _RandomUnique (Générer un nombre unique).

Partagez des fonctions et des UDF AutoIt.
Règles du forum
.
Répondre
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

[Func] _RandomUnique (Générer un nombre unique).

#1

Message par Tlem »

Par trois fois, il y a eu la demande de générer un nombre aléatoire unique. :mrgreen:
Voici donc une fonction qui permet de réaliser cette demande.

Le code pourrait sans aucun doute être simplifié en utilisant des fonctions spécifiques aux tableaux, mais le but est d'éviter d'utiliser un quelconque Include afin de ne pas être dépendant de quoi que ce soit. ;)

Code : Tout sélectionner

; #FUNCTION# ===========================================================================================
; Name:             _RandomUnique
; Description:      This function return a int number beetween a range of 2 values but never return the
;                   same value on one session of the script. You can generate values for several variable.
;                   Each variable is represented by an array that must be declared before.
; Syntax:           _RandomUnique($aVar, [$szMin = 0, [$szMax = 1]])
; Parameter(s):     $aVar = The array that will contains all the values generated.
;                   $szMin = optional: The minimal value of the range.
;                   $szMax = Optional: The maximal value of the range.
; Requirement(s):   none
; Return Value(s):  on success  : A Int number beetween $szMin and $szMax
;                   on error    : An empty value and set error to 1.
;                                 Extented value are :  1 if $aVar is not an array
;                                                       2 if all the values have been given.
; Author(s):        Tlem
; Note:             Don't forget to déclare an empty array before using the function.
;                   eg:     Global $Var1[1]
;                           $Var = _RandomUnique($Var1, 1, 10)
; ====================================================================================================
Func _RandomUnique(ByRef $aVar, $szMin = 0, $szMax = 1)
    Local $Res, $ii

    ; Check if $aVar is an array.
    ; Vérifie si $aVar est un tableau
    If Not IsArray($aVar) Then
        SetError(1, 1)
        Return ''
    EndIf

    $aSize = UBound($aVar)

    ; Check if array is bigger than max value.
    ; Vérifie si la tableau ne dépasse pas la valeur max
    If $aSize - 1 >= $szMax Then
        SetError(1, 2)
        Return ''
    EndIf

    While 1
        Local $szFlag = 0
        ; Get a random value between $szMin and $szMax (Int value)
        ; Récupère une valeur aléatoire entre $szMin et $szMax (valeur entière)
        $Res = Random(Int($szMin), Int($szMax), 1)

        ; If array is empty then add value to the array and exit loop.
        ; Si le tableau est vide, alors ajoute la valeur au tableau et quitte la boucle.
        If $aSize = 1 Then
            ReDim $aVar[$aSize + 1]
            $aVar[0] = $aSize + 1
            $aVar[$aSize] = $Res
            ExitLoop
        EndIf

        ; Check if value allready exist in array.
        ; Vérifie si la valeur existe déjà dans le tableau.
        For $ii = 1 To $aSize - 1
            If $aVar[$ii] = $Res Then $szFlag = 1
        Next

        ; No error => Add value to the array and exit loop.
        ; Si pas d'erreur => Ajoute la valeur au tableau et quitte la boucle.
        If $szFlag = 0 Then
            ReDim $aVar[$aSize + 1]
            $aVar[0] = $aSize + 1
            $aVar[$aSize] = $Res
            ExitLoop
        EndIf
    WEnd

    Return $Res
EndFunc   ;==>_RandomUnique
Voici un exemple d'utilisation avec 3 tableaux :

Code : Tout sélectionner

Global $Tableau1[1]
Global $Tableau2[1]
Global $Tableau3[1]

For $i = 1 To 10
    ConsoleWrite("Random " & $i & @TAB & _
    " Tableau n°1 = " & _RandomUnique($Tableau1, 1, 10) & @TAB & _
    " Tableau N°2 = " & _RandomUnique($Tableau2, 1, 10) & @TAB & _
    " Tableau N°3 = " & _RandomUnique($Tableau3, 1, 10) & @CRLF)
Next
Le principe du code ci-dessus, est d'initialiser un tableau (celui qui contiendra toutes les valeurs qui seront données) puis d'utiliser la fonction tel que :

Code : Tout sélectionner

_RandomUnique($Tableau, $Valeur_Mini, $Valeur_Max)
  • - $Tableau représente le tableau initialisé précédemment.
    - $Valeur_Mini représente la valeur minimum de la portée.
    - $Valeur_Max représente la valeur maximum de la portée.
La fonction _RandomUnique() retourne donc un nombre entier entre $Valeur_Mini et $Valeur_Max sans jamais retourner le même nombre.
Vous pouvez évidement initialiser autant de tableau que nécessaire dans le cas ou vous auriez besoin de valeurs sur des portées différentes ou parallèles. ;)
Habibsbib
Niveau 7
Niveau 7
Messages : 393
Enregistré le : dim. 30 août 2009 13:49
Localisation : Euh...Verticale, entre le siège et l'écran...
Status : Hors ligne

Re: [Func] _RandomUnique (Générer un nombre unique).

#2

Message par Habibsbib »

Désolé, mais j'ai pas compris l'utilité de cette fonction :mrgreen: (pas taper !)
Que voulez-vous dire par "nombre unique" ?
Cela signifie que les nombres possibles sont seulement 0-1-2-3-4-5-6-7-8-9 ?
Ou alors j'ai rien compris ? Merci de m'expliquer :)
Avatar du membre
Narmeke
Niveau 6
Niveau 6
Messages : 247
Enregistré le : mer. 28 oct. 2009 11:31
Localisation : Libourne
Status : Hors ligne

Re: [Func] _RandomUnique (Générer un nombre unique).

#3

Message par Narmeke »

En gros, pour faire simple, si tu veux tiré un nombre entre 0 et 9, tu pourra obtenir le nombre piocher qu'une seul fois !

Ex :
Liste ==> 0,1,2,3,4,5,6,7,8,9
On pioche ==> ah !! on a un 4

Liste ==> 0,1,2,3,5,6,7,8,9
On pioche ==> ah !! on a un 9

Liste ==> 0,1,2,3,5,6,7,8
On pioche ==> ah !! on a un 2

Liste ==> 0,1,3,5,6,7,8

Impossible d'obtenir 2 fois le même résultat !!

En espérant avoir était compréhensible :lol:
Salutation Narmeke
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [Func] _RandomUnique (Générer un nombre unique).

#4

Message par Tlem »

C'est assez bien résumé.
Mais pour être un peut plus précis, j'ai rajouté une petite explication à la fin du premier message. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

Re: [Func] _RandomUnique (Générer un nombre unique).

#5

Message par timmalos »

Avec quelques notions en maths, on aurait pu creer cette fonction sans utiliser de variable globale, grâce aux modulos.

Ce tutoriel http://www.siteduzero.com/tutoriel-3-82 ... -rand.html est assez interessant sur le sujet, et si on choisit le bon nombre et qu'on ne fait pas un tour complet, on est sur de ne jamais avoir le même nombre ;)
Répondre