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
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
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.
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.