Что нового

Перебрать индексы массива в случайном порядке без повторов

aptyp

Новичок
Сообщения
36
Репутация
0
Например есть пустой массив.

$array[12]

Нужен пример )
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Код:
dim $array[12] = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"] ; Произвольное заполнение массива для демонстрации работы.
const $n = 12
dim $arrayAuxiliary[$n]
For $i = 0 To $n - 1
   $arrayAuxiliary[$i] = $i
Next
For $i = 0 To $n - 2
   $j = Random($i, $n - 1, 1)
   $buffer = $arrayAuxiliary[$i]
   $arrayAuxiliary[$i] = $arrayAuxiliary[$j]
   $arrayAuxiliary[$j] = $buffer
Next
; В этот момент случайный порядок индексов для обращения готов. Далее для демонстрации выводится основной массив в этом порядке.
$sText = ""
For $i = 0 To $n - 1
   $sText &= $array[$arrayAuxiliary[$i]] & @CRLF
Next
MsgBox(4096, "", $sText)
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Код:
#include <Array.au3>
Local $array=['a','b','c','d','e','f','g','h','i','j','k','l']
_ArrayDisplay($array)
_ArrayRandomize($array)
_ArrayDisplay($array)
MsgBox(4096,'Массив-Строка',_ArrayToString($array))
; пересобирание массива случайным образом
Func _ArrayRandomize(ByRef $avArray,$iStart=0)
  Local $b=UBound($avArray)-1,$k,$0
  For $i=$iStart To $b
  $k=Random($i,$b,1)
  $0=$avArray[$i]
  $avArray[$i]=$avArray[$k]
  $avArray[$k]=$0
  Next
EndFunc
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Код:
#include <Array.au3>
Local $array=['a','b','c','d','e','f','g','h','i','j','k','l']
_ArrayDisplay($array)
_ArrayRandomize($array)
_ArrayDisplay($array)
MsgBox(4096,'Массив-Строка',_ArrayToString($array))
; пересобирание массива случайным образом
Func _ArrayRandomize(ByRef $avArray,$iStart=0)
  Local $b=UBound($avArray)-1,$k,$0
  For $i=$iStart To $b
  $k=Random($i,$b,1)
  $0=$avArray[$i]
  $avArray[$i]=$avArray[$k]
  $avArray[$k]=$0
  Next
EndFunc
О пересобирании топикстартер явно не спрашивал, он даже массив пустым предлагал изначально, так что заполнение массива у меня только для демонстрации работы. Нужно было получить случайное тасование индексов, а затем использовать его можно для очень разных целей, а не только для продемонстрированной (и при этом незапрошенной).
 

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
О пересобирании топикстартер явно не спрашивал
Тогда речь идёт о простом получении случайных цифр в диапазоне без повторов, для этого не нужно два цикла:

Код:
#include <Array.au3>
$n=12
$aRes=_Get_Number_Without_Repetitions($n)
_ArrayDisplay($aRes)

Func _Get_Number_Without_Repetitions($iCount,$iStart=0,$iEnd=Default)
  If $iEnd=Default Then $iEnd=$iCount-1
  If $iEnd<$iStart Then Dim $tmp=$iStart,$iStart=$iEnd,$iEnd=$tmp
  If $iEnd-$iStart<$iCount Then $iCount=$iEnd-$iStart+1
  Local $aTmp[$iEnd+1],$aResult[$iCount],$k=-1
  Do
    $iIndex=Random($iStart,$iEnd,1)
    If $aTmp[$iIndex]Then ContinueLoop
    $k+=1
    $aTmp[$iIndex]=1
    $aResult[$k]=$iIndex
  Until $k=$iCount-1
  Return $aResult
EndFunc

Сообщение автоматически объединено:

Код:
#include <Array.au3>
$n=12
$aRes=_Get_Number_Without_Repetitions_Map($n)
_ArrayDisplay($aRes)

Func _Get_Number_Without_Repetitions_Map($iCount,$iStart=0,$iEnd=Default)
  If $iEnd=Default Then $iEnd=$iCount-1
  If $iEnd<$iStart Then Dim $tmp=$iStart,$iStart=$iEnd,$iEnd=$tmp
  If $iEnd-$iStart<$iCount Then $iCount=$iEnd-$iStart+1
  Local $mTmp[]
  Do
    $mTmp[Random($iStart,$iEnd,1)]=0
  Until UBound($mTmp)=$iCount
  Return MapKeys($mTmp)
EndFunc
 
Последнее редактирование:
Верх