searchresult Posted November 7, 2007 Share Posted November 7, 2007 Hi I want to make 10 random numbers from 0 to 9. Problem is i don't want them to repeat it self. example: 1. - 0 8 9 5 6 3 7 4 1 2 2. - 3 5 7 4 2 9 0 8 2 1 here is my code: FileOpen("123.txt", 1) Dim $array[10] For $i = 0 to 9 $array[$i] = Random(0, 9, 1) For $j = 0 To $i While $array[$j] = $array[$i] $array[$i] = Random(0, 9, 1) WEnd Next FileWrite("123.txt", $array[$i] & @CRLF) Next Am I doing something wrong here? Link to comment Share on other sites More sharing options...
Madza91 Posted November 7, 2007 Share Posted November 7, 2007 Mislis ovako: Did you mean like this: FileOpen("123.txt",1) Dim $array[10] For $i = 0 to 9 $array[$i] = Random(0, 9, 1) For $j = 0 To $i While $array[$j] = $array[$i] $array[$i] = Random(0, 9, 1) FileWrite("123.txt", $array[$i] & @CRLF) Exit WEnd Next Next [quote name='dbzfanatic' post='609696' date='Nov 26 2008, 08:46 AM']This is a help forum not a "write this for me" forum.[/quote](Sorry for bad English) :) Link to comment Share on other sites More sharing options...
Moderators SmOke_N Posted November 7, 2007 Moderators Share Posted November 7, 2007 (edited) #include <array.au3> Global $nRan, $sHold, $nCount While $nCount < 10 $nRan = Random(0, 9, 1) If StringInStr("," & $sHold, "," & $nRan & ",") = 0 Then $sHold &= $nRan & "," $nCount += 1 EndIf WEnd MsgBox(0, "info", $sHold) ;Make array $aSplit = StringSplit(StringTrimRight($sHold, 1), ",") _ArrayDisplay($aSplit) Edited November 7, 2007 by SmOke_N Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer. Link to comment Share on other sites More sharing options...
jvanegmond Posted November 7, 2007 Share Posted November 7, 2007 (edited) Or this: #include <Array.au3> Dim $sStart[10] = [0,1,2,3,4,5,6,7,8,9] Dim $sEnd[10] For $x = 0 to 9 ;Randomly pick a number that is still in the array $i = Random(0,UBound($sStart)-1,1) $sEnd[$x] = $sStart[$i] _ArrayDelete($sStart,$i) Next _ArrayDisplay($sEnd) This only uses the Random function 10 times. Edited November 7, 2007 by Manadar github.com/jvanegmond Link to comment Share on other sites More sharing options...
searchresult Posted November 7, 2007 Author Share Posted November 7, 2007 Mislis ovako: Did you mean like this: FileOpen("123.txt",1) Dim $array[10] For $i = 0 to 9 $array[$i] = Random(0, 9, 1) For $j = 0 To $i While $array[$j] = $array[$i] $array[$i] = Random(0, 9, 1) FileWrite("123.txt", $array[$i] & @CRLF) Exit WEnd Next Next ne ba tako. triba upisati svih 10 brojeva pa izlaz nije ba opcija. ako makne exit onda sam opet na početku not that way cause i need it to write all 10 numbers se exit is not an option. if you move exit then back to start and it writes only one first random number Link to comment Share on other sites More sharing options...
Madza91 Posted November 7, 2007 Share Posted November 7, 2007 (edited) to jes :/ Edited April 9, 2008 by n3nE [quote name='dbzfanatic' post='609696' date='Nov 26 2008, 08:46 AM']This is a help forum not a "write this for me" forum.[/quote](Sorry for bad English) :) Link to comment Share on other sites More sharing options...
PsaltyDS Posted November 7, 2007 Share Posted November 7, 2007 Hi I want to make 10 random numbers from 0 to 9. Problem is i don't want them to repeat it self. example: 1. - 0 8 9 5 6 3 7 4 1 2 2. - 3 5 7 4 2 9 0 8 2 1 here is my code: Am I doing something wrong here? The problem with that kind of loop is the repeated looping through the array. Work with a string, and only break it into an array when finished: #include <array.au3> $Timer = TimerInit() Dim $sData = "" For $i = 0 To 9 While 1 $iData = Random(0, 9, 1) If StringInStr($sData, String($iData)) Then ContinueLoop Else $sData &= "," & $iData ExitLoop EndIf WEnd Next $avData = StringSplit(StringTrimLeft($sData, 1), ",") _ArrayDisplay($avData, "Debug: Results in " & Round(TimerDiff($Timer) / 1000, 3) & " seconds.") Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
Madza91 Posted November 7, 2007 Share Posted November 7, 2007 Evo kao sto je Smoke_N napisao ali malo izmenjeno i mislim da je to tebi potrebno: Global $nRan, $sHold, $nCount While $nCount < 10 $nRan = Random(0, 9, 1) If StringInStr("," & $sHold, "," & $nRan & ",") = 0 Then $sHold &= $nRan & @CRLF $nCount += 1 EndIf WEnd FileWrite("123.txt", $sHold) Zar ne [quote name='dbzfanatic' post='609696' date='Nov 26 2008, 08:46 AM']This is a help forum not a "write this for me" forum.[/quote](Sorry for bad English) :) Link to comment Share on other sites More sharing options...
jvanegmond Posted November 7, 2007 Share Posted November 7, 2007 The problem with that kind of loop is the repeated looping through the array. Work with a string, and only break it into an array when finished: #include <array.au3> $Timer = TimerInit() Dim $sData = "" For $i = 0 To 9 While 1 $iData = Random(0, 9, 1) If StringInStr($sData, String($iData)) Then ContinueLoop Else $sData &= "," & $iData ExitLoop EndIf WEnd Next $avData = StringSplit(StringTrimLeft($sData, 1), ",") _ArrayDisplay($avData, "Debug: Results in " & Round(TimerDiff($Timer) / 1000, 3) & " seconds.") I've tested all the methods a few time, but yours seems to be the fastest.. Always coming in at 1.5 seconds. github.com/jvanegmond Link to comment Share on other sites More sharing options...
Moderators SmOke_N Posted November 7, 2007 Moderators Share Posted November 7, 2007 Evo kao sto je Smoke_N napisao ali malo izmenjeno i mislim da je to tebi potrebno: Global $nRan, $sHold, $nCount While $nCount < 10 $nRan = Random(0, 9, 1) If StringInStr("," & $sHold, "," & $nRan & ",") = 0 Then $sHold &= $nRan & @CRLF $nCount += 1 EndIf WEnd FileWrite("123.txt", $sHold) Zar ne Boy the online translator really murdered that one!!! Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer. Link to comment Share on other sites More sharing options...
jvanegmond Posted November 8, 2007 Share Posted November 8, 2007 Boy the online translator really murdered that one!!!Haha, I love it how it translates Smoke_N as Tuxedo!!! Evo as a hundred had Tuxedo written limit few izmenjeno plus thinker that it is you necessarily github.com/jvanegmond Link to comment Share on other sites More sharing options...
Madza91 Posted November 8, 2007 Share Posted November 8, 2007 (edited) lol Evo kao sto je Smoke_N napisao ali malo izmenjeno i mislim da je to tebi potrebno=~ I think you need something like Smoke_N's code but with little changes Edited November 8, 2007 by n3nE [quote name='dbzfanatic' post='609696' date='Nov 26 2008, 08:46 AM']This is a help forum not a "write this for me" forum.[/quote](Sorry for bad English) :) Link to comment Share on other sites More sharing options...
jvanegmond Posted November 8, 2007 Share Posted November 8, 2007 lol Evo kao sto je Smoke_N napisao ali malo izmenjeno i mislim da je to tebi potrebno=~I think you need something like Smoke_N's code but with little changes I would go with PsaltyDS' one. github.com/jvanegmond Link to comment Share on other sites More sharing options...
Moderators SmOke_N Posted November 8, 2007 Moderators Share Posted November 8, 2007 I would go with PsaltyDS' one.I definately don't want to rain on a parade... but are you sure you tested that right? I keep going over it, and the extra function calls are much slower. Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer. Link to comment Share on other sites More sharing options...
Moderators SmOke_N Posted November 8, 2007 Moderators Share Posted November 8, 2007 I removed the way I was doing mine to be similar to his ie... $sHold &= $nRan & "," To $sHold &= "," & $nRan Then changed StringTrimRight to StringTrimLeft .... and the speed doubled. (I'll admit, I hadn't looked at that approach before... but it make sense) (Had to change his up a bit to be able to handle more than 10 chars) Now, if you run mine first:$Timer1 = TimerInit() Global $nRan, $sHold, $nCount, $sTemp While $nCount < 100 $nRan = Random(0, 99, 1) If StringInStr("," & $sHold, "," & $nRan & ",") = 0 Then $sHold &= "," & $nRan $nCount += 1 EndIf WEnd $aSplit = StringSplit(StringTrimLeft($sHold, 1), ",") $sTime = "SmOke_N: " & TimerDiff($Timer1) & @CRLF $Timer2 = TimerInit() Dim $sData = "" For $i = 0 To 99 While 1 $iData = Random(0, 99, 1) If StringInStr("," & $sData, "," & $iData & ",") Then ContinueLoop Else $sData &= "," & $iData ExitLoop EndIf WEnd Next $avData = StringSplit(StringTrimLeft($sData, 1), ",") $sTime &= "PsaltyDS: " & TimerDiff($Timer2) MsgBox(64, "info", $sTime) You'll see the one ran first is slower always.... Is that how you were running them (his last)? Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer. Link to comment Share on other sites More sharing options...
searchresult Posted November 8, 2007 Author Share Posted November 8, 2007 #include <array.au3> Global $nRan, $sHold, $nCount While $nCount < 10 $nRan = Random(0, 9, 1) If StringInStr("," & $sHold, "," & $nRan & ",") = 0 Then $sHold &= $nRan & "," $nCount += 1 EndIf WEnd MsgBox(0, "info", $sHold) ;Make array $aSplit = StringSplit(StringTrimRight($sHold, 1), ",") _ArrayDisplay($aSplit) I modified this version and it worked great for me. Thanks everybody, for the effort. Link to comment Share on other sites More sharing options...
therks Posted November 9, 2007 Share Posted November 9, 2007 Just had to add my own little contribution. In tests this method was faster than Smoke's, but I'm not sure if I tested properly... #include <Array.au3> Local $array[10] = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ] _ArrayShuffle($array) _ArrayDisplay($array) Func _ArrayShuffle(ByRef $aArray, $iBase = 0, $iUBound = 0) If $iUBound = 0 Then $iUBound = UBound($aArray) - 1 Local $temp, $rand For $i = $iBase To $iUBound $temp = $aArray[$i] $rand = Random(0, $iUBound, 1) $aArray[$i] = $aArray[$rand] $aArray[$rand] = $temp Next EndFunc My AutoIt Stuff | My Github Link to comment Share on other sites More sharing options...
jvanegmond Posted November 9, 2007 Share Posted November 9, 2007 (edited) You'll see the one ran first is slower always.... Is that how you were running them (his last)?When just running the first test, I first get a result where it says:Smoke_N: 10.66...PsaltyDS: 10.96The next result is:Smoke_N: 8.42PsaltyDS: 10.61The next result after that is:Smoke_N: 10.66PsaltyDS: 8.26That seems pretty contradictory to what you say. In my tests, I was running both of the methods separately by the way. Edited November 9, 2007 by Manadar github.com/jvanegmond Link to comment Share on other sites More sharing options...
PsaltyDS Posted November 9, 2007 Share Posted November 9, 2007 That seems pretty contradictory to what you say. In my tests, I was running both of the methods separately by the way.This is a random sequence generator. The number of times it has to test a number each run will be... random. The depth it will have to search to disqualify a number will be... random. If you plot all the times from a huge number of runs, I bet you get a nice statistical bell curve of standard distribution. Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law Link to comment Share on other sites More sharing options...
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