cypher175 Posted October 5, 2009 Posted October 5, 2009 Say I have an Array of 10 Elements like so.. Dim $Array[10] $Array[0]="A" $Array[1]="B" $Array[2]="C" $Array[3]="D" $Array[4]="E" $Array[5]="F" $Array[6]="G" $Array[7]="H" $Array[8]="I" $Array[9]="J" And I want to Insert all of those Elements into a String by a Random Order. $NormalString = "A B C D E F G H I J" <--Normal Order $NormalString = $Array[0]&" "&$Array[1]&" "&$Array[2]&" "&$Array[3]&" "&$Array[4]&" "&$Array[5]&" "&$Array[6]&" "&$Array[7]&" "&$Array[8]&" "&$Array[9] $RandomString = "E C I J H B G F A D" <--Random Order $RandomString = $Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)] How do I make it so that each Array Element only gets randomly inserted once into the String..??
Gh0stGenesis Posted October 5, 2009 Posted October 5, 2009 well i know to randomize arrays you can use Array Randomize Function _ArrayRandomize($<variable>) and than just implement it in a string
cypher175 Posted October 5, 2009 Author Posted October 5, 2009 is _ArrayRandomize() even a real function/UDF..??
Mison Posted October 5, 2009 Posted October 5, 2009 (edited) is _ArrayRandomize() even a real function/UDF..?? I just checked the help file and I don't think it's exist... try this: #include <Array.au3> Dim $aArray[6] = [1, 2, 3, 4, 5, 6] _ArrayRandom($aArray) _ArrayDisplay($aArray) Func _ArrayRandom(ByRef $a) $u = UBound($a) -1 For $i = 0 To $u _ArraySwap($a[Random(0,$u,1)], $a[Random(0, $u,1)]) Next EndFunc you can use better algorithm, this one is just an example to show how it works... Edited October 5, 2009 by Mison Hi ;)
Malkey Posted October 5, 2009 Posted October 5, 2009 Say I have an Array of 10 Elements like so.. Dim $Array[10] $Array[0]="A" $Array[1]="B" $Array[2]="C" $Array[3]="D" $Array[4]="E" $Array[5]="F" $Array[6]="G" $Array[7]="H" $Array[8]="I" $Array[9]="J" And I want to Insert all of those Elements into a String by a Random Order. $NormalString = "A B C D E F G H I J" <--Normal Order $NormalString = $Array[0]&" "&$Array[1]&" "&$Array[2]&" "&$Array[3]&" "&$Array[4]&" "&$Array[5]&" "&$Array[6]&" "&$Array[7]&" "&$Array[8]&" "&$Array[9] $RandomString = "E C I J H B G F A D" <--Random Order $RandomString = $Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)]&" "&$Array[Random(0, 9, 1)] How do I make it so that each Array Element only gets randomly inserted once into the String..?? This is one way of creating a random ordered string from a sorted array. ; #include <Array.au3> Local $Array[10] $Array[0]="A" $Array[1]="B" $Array[2]="C" $Array[3]="D" $Array[4]="E" $Array[5]="F" $Array[6]="G" $Array[7]="H" $Array[8]="I" $Array[9]="J" _ArrayDisplay($Array) Local $x = -1, $RandomString = "" While $x <> UBound($Array) - 1 $iRandNum = Random(0, 9, 1) If StringInStr($RandomString, $Array[$iRandNum]) = 0 Then $RandomString &= $Array[$iRandNum] & " " $x += 1 EndIf WEnd ;ConsoleWrite($x & " " & $RandomString & @CRLF) MsgBox(0, "Random String", $RandomString) ;
RagsRevenge Posted October 24, 2009 Posted October 24, 2009 This is one way of creating a random ordered string from a sorted array. ; #include <Array.au3> Local $Array[10] $Array[0]="A" $Array[1]="B" $Array[2]="C" $Array[3]="D" $Array[4]="E" $Array[5]="F" $Array[6]="G" $Array[7]="H" $Array[8]="I" $Array[9]="J" _ArrayDisplay($Array) Local $x = -1, $RandomString = "" While $x <> UBound($Array) - 1 $iRandNum = Random(0, 9, 1) If StringInStr($RandomString, $Array[$iRandNum]) = 0 Then $RandomString &= $Array[$iRandNum] & " " $x += 1 EndIf WEnd ;ConsoleWrite($x & " " & $RandomString & @CRLF) MsgBox(0, "Random String", $RandomString) ; I modified your code (thanks) to suit my own need for a randomizeArray function. I am randomizing an array of filenames, but it can be used for any type of 1 based array. func RandomizeArray(byRef $array) local $numItems = $array[0] local $tempArray[$numItems+1] $tempArray[0] = $numItems Local $x = 1, $RandomString = "" while $x <= $numItems $iRandNum = Random(1, $numItems, 1) ;ConsoleWrite($iRandNum & @CRLF) If StringInStr($RandomString, " - " & $iRandNum & " - ") = 0 Then ;using this format to avoid incorrect matches ;ConsoleWrite("x: " & $x & " $numItems: " & $tempArray[0] & @CRLF) $tempArray[$x] = $array[$iRandNum] $RandomString &= " - " & $iRandNum & " - " $x += 1 ;ConsoleWrite($RandomString & " " & $array[$iRandNum] & " x: " & $x & " iRandom: " & $iRandNum & @CRLF) EndIf WEnd $array = $tempArray EndFunc I haven't done extensive performance testing but it loops between 100 and 200 times in general in randomizing 30 items. Is there a better way for randomizing an array? D
Malkey Posted October 24, 2009 Posted October 24, 2009 (edited) .... Is there a better way for randomizing an array? D Randomizing an array could be called shuffling an array. Here is another. ; #include <Array.au3> ;; http://www.autoitscript.com/forum/index.php?showtopic=103429&view=findpost&p=739291 Local $Array[10], $aShuffledArr $Array[0] = "A" $Array[1] = "B" $Array[2] = "C" $Array[3] = "D" $Array[4] = "E" $Array[5] = "F" $Array[6] = "G" $Array[7] = "H" $Array[8] = "I" $Array[9] = "J" ;Will not include array[0] in shuffle, with $iStartShuffIndx set to 1. $aShuffledArr = _ArrayShuffle($Array, 1, 2) _ArrayDisplay($aShuffledArr) ConsoleWrite(_ArrayToString($aShuffledArr, @CRLF, 1) & @CRLF); Start string at array index 1 Func _ArrayShuffle($Array, $iStartShuffIndx = 0, $iNumOfShuffles = 2) Local $iSize = UBound($Array), $s2, $i ;shuffle array For $n = 1 To $iNumOfShuffles For $i = $iStartShuffIndx To $iSize - 1 Do $s2 = Random($iStartShuffIndx, $iSize - 1, 1) Until $i <> $s2 _ArraySwap($Array[$i], $Array[$s2]) Next Next Return $Array EndFunc ;==>_ArrayShuffle Edit: Slightly modified function - more efficient. Edit2: Ok, I think I've got it this time. Edited October 25, 2009 by Malkey
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now