Page 1 sur 1

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

Posté : ven. 02 avr. 2010 22:39
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. ;)

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

Posté : mer. 14 avr. 2010 15:12
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 :)

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

Posté : mer. 14 avr. 2010 15:29
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

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

Posté : mer. 14 avr. 2010 18:38
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. ;)

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

Posté : mer. 14 avr. 2010 22:18
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 ;)