randomly order a list
Dave Cragg
dave.cragg at lacscentre.co.uk
Fri May 24 06:04:41 EDT 2013
Nice one, Alex. I spent an hour convincing myself that the sA array could contain duplicate elements after the loop, until the penny dropped. Remind me never to play cards if you're shuffling. :-)
Dave
On 24 May 2013, at 00:41, Alex Tweedly <alex at tweedly.net> wrote:
>
> Yes, that's a good shuffle for small data, but a bit slow for larger data sets. I dug out an old function I wrote a few years ago (and converted it to LC); this would be faster for large data sets (time taken grows linearly rather than by the square of the number of lines).
>
> local sA, sIndex -- filled with random shuffle index, returned one-by-one from fn calls
>
> function shuffleLines pSource
> put empty into tNew
> put the number of lines of pSource into tNum
> -- fill an array with 'self' numbers
> repeat with i = 1 to tNum
> put i into tA[i]
> end repeat
>
> repeat with n = tNum down to 1
> put random(n) into tRand
> put tA[tRand] into sA[n]
> put tA[n] into tA[tRand]
> end repeat
> put 0 into sIndex
> sort lines of pSource by _shuffle()
> return pSource
> end shuffleLines
>
> function _shuffle
> add 1 to sIndex
> return sA[sIndex]
> end _shuffle
>
> -- Alex.
>
More information about the use-livecode
mailing list