[Gambas-user] A random sort of listview

Simonart Dominique simonart.dominique at ...11...
Wed Apr 8 17:38:32 CEST 2009


Hi Jussi,

NO, there is no bug, it's my mistake!!
I listed the myArray values just after the SWAP instruction. 
But, as you can see it in a preceeding answer to jbskaggs, 
this is a bad idea because in the "forward FOR NEXT loop" 
case, these values could change any time. You don't make 
this error :) so you got the good result!

Since these values cannot change after they were selected in 
the "Backward FOR NEXT loop" case, my mistake had no 
consequence. We could consider this as a more efficient 
method since the correct result is available sooner!

Dominique Simonart

Jussi Lahtinen a écrit :
> Hi!
> 
> I can't reproduce your problem.
> Randomize with seed 12345, I got;
>>From 0 to 9: 4 0 7 9 5 1 2 6 3 8
>>From 9 to 0: 4 2 7 8 3 0 6 9 1 5
> Both correct.
> 
> So maybe there is a bug in SWAP command with Gambas version... what
> are you using?
> With Gambas 2.10 it is working.
> 
> 
> Jussi
> 
> 
> P.S. Code I used to test:
> 
> DIM ii AS Integer
> DIM jj AS Integer
> DIM a AS Integer
> DIM myArray AS Integer[200]
> DIM checkArray AS NEW Integer[]
> 
> RANDOMIZE 12345
> 
> FOR ii = 0 TO 9 '199
> myArray[ii] = ii
> NEXT
> 
> FOR ii = 0 TO 9 '199 ' random swap array items
> a = Int(Rnd(ii + 1))
> SWAP myArray[ii], myArray[a]
> NEXT
> 
> 
> FOR ii = 0 TO 9 '199 ' Check against duplicates.
> PRINT myArray[ii]
>  FOR jj = 0 TO 9 '199
>  IF myArray[ii] = jj THEN
>   IF checkArray.Exist(jj) = FALSE THEN
>   checkArray.Add(jj)
>   ELSE
>   Message.Error("Error!")
>   RETURN
>   ENDIF
>  ENDIF
>  NEXT
> NEXT
> 
> 
> PRINT checkArray.Count
> 
> 
> 
> On Wed, Apr 8, 2009 at 00:12, Simonart Dominique
> <simonart.dominique at ...11...> wrote:
>> Hi,
>>
>> jbskaggs a écrit :
>>> Okay,
>>>
>>> But why does it do that?  I don't see why the direction should matter what
>>> am I missing ?  Becuase maybe this is something that has plagued me and
>>> caused me headaches for a while.
>>>
>>> JB Skaggs
>>>
>> You're right! Thanks!
>> My mistake is that I listed the myArray values inside the
>> SAME for next loop that the swap! But of course, the values
>> could change at each next step
>>
>> However, there is differences. Let see a step by step sample
>>
>> CASE 1: Forward FOR NEXT loop
>>
>> * i=0 -> Int(Rnd(i+1)) = 0!
>> you could affect only myArray[0] to myArray[0]
>> * i=1 -> Int(Rnd(i+1)) = 0-1
>> you could affect myArray[0] once more
>> * i=2 -> Inn(Rnd(i+1)) = 0-2
>> idem
>> * i=3 ...
>> at each step, ALWAYS you could affect an already selected value
>>
>> CASE 2: Backward FOR NEXT loop
>>
>> * i=199 -> Int(Rnd(i+1)) = 0-199
>> myArray[199] could be any value
>> * i=198 -> Int(Rnd(i+1)) = 0-198
>> myArray[198] could be any of the non selected values
>> myArray[199] will never be affected anymore
>> * i=197 ...
>> at each step, NEVER you could affect an already selected value
>>
>> I found the second case more satisfying for my mind! :)
>>
>> Hope this send your headache away! :)
>> Dominique Simonart
>>>
>>>
>>> Simonart Dominique wrote:
>>>> Hi,
>>>>
>>>> jbskaggs a écrit :
>>>>> When I ran the code it ran fine- why is it important to have it  count
>>>>> backwards in the random swap?
>>>>>
>>>>> ie for i =199 to 0 step -1 instead of for i=0 to 199 step 1?
>>>>>
>>>>> JB SKaggs
>>>>>
>>>> Strange, because it should not  :)
>>>> run a test with 10 numbers 0-9 and fixe the seed with
>>>> RANDOMIZE 12345
>>>> If you run the forward FOR NEXT you will get:
>>>> 0 0 2 3 1 1 2 6 3 8
>>>> which is wrong!
>>>> but if you run the backward FOR NEXT you will get:
>>>> 5 1 9 6 0 3 8 7 2 4
>>>> which is right!
>>>>
>>>> May be you did not notice it because 200 is long enough
>>>> before you get the same number twice, and before you remark
>>>> that some are missing?
>>>>
>>>> Dominique Simonart
>>>>
>>>>> Simonart Dominique wrote:
>>>>>> Hi,
>>>>>>
>>>>>> Hmm, did you run exactly this code? If so, there is
>>>>>> something wrong with the second FOR NEXT loop
>>>>>>
>>>>>> jbskaggs a écrit :
>>>>>>> using your suggestions and the swap command vs manual swapping this is
>>>>>>> my
>>>>>>> code:
>>>>>>>
>>>>>>> public b as string  'optional string used to hold the array data for
>>>>>>> file
>>>>>>> or
>>>>>>> split later
>>>>>>>
>>>>>>> PUBLIC SUB button4_click() ' initialize array
>>>>>>> DIM myArray AS Integer[200]
>>>>>>> DIM a AS Integer
>>>>>>> DIM i AS Integer
>>>>>>>
>>>>>>> FOR i = 0 TO 199 STEP 1 'add array items
>>>>>>>  myArray[i] = i
>>>>>>> NEXT
>>>>>>>
>>>>>>> FOR i = 0 TO 199 STEP 1 ' random swap array items
>>>>>>> a = Int(Rnd(i + 1))
>>>>>>> SWAP myArray[i], myArray[a]
>>>>>>> NEXT
>>>>>>>
>>>>>> the right code is:
>>>>>>
>>>>>> FOR i = 199 TO 0 STEP -1
>>>>>>     ...
>>>>>> NEXT
>>>>>>
>>>>>>> FOR i = 0 TO 199 STEP 1 ' write items in listview2
>>>>>>> listview1.MoveTo(myArray[i])
>>>>>>> c = listview1.Item.Key
>>>>>>> listview2.add(c, listview1.item.text)
>>>>>>> NEXT
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> FOR i = 0 TO 199 STEP 1 'optional step to write array as a string for
>>>>>>> file
>>>>>>> or whatever use
>>>>>>> b &= "slot" & myArray[i] & ","
>>>>>>> NEXT
>>>>>>> PRINT b
>>>>>>> END
>>>>>>>
>>>>>>> PUBLIC SUB Button1_Click() 'an optional way to load the array values
>>>>>>> from
>>>>>>> the variable b and / or a file if b was file loaded
>>>>>>> DIM egg AS String[]
>>>>>>> DIM c AS String
>>>>>>>  listview1.Clear
>>>>>>>  egg = Split(b, ",")
>>>>>>>  FOR EACH c IN egg
>>>>>>> TRY listview1.Add(c, c)
>>>>>>> IF ERROR THEN RETURN
>>>>>>> NEXT
>>>>>>> IF listview1.Count >= 200 THEN RETURN
>>>>>>> END
>>>>>>>
>>>>>>> JB Skaggs
>>>>>>>
>>>>>> Dominique Simonart
>>>>>>
>>>> Dominique Simonart





More information about the User mailing list