randomly order a list
Alex Tweedly
alex at tweedly.net
Thu May 23 19:41:49 EDT 2013
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.
On 23/05/2013 23:21, Dave Cragg wrote:
> On 23 May 2013, at 21:11, Björnke von Gierke <bvg at mac.com> wrote:
>
>> Yes, that is why I myself lean towards a feature request. For example the following line could tell the engine to make a unique random number for each of the supplied lines, to not have the problem with lines that come first getting a higher probability:
>>
>> sort theData by random(the number of lines in theData) of each
> If we're going for a feature request, I'd suggest a new function "shuffle". It's more descriptive than 'sort'. (We're trying to do the opposite of sorting.)
>
> I'm also uncomfortable with using arbitrary high numbers. (How random should it be?) When i've done this before, I've used the analogy of pulling names out of a hat. So a custom function like this (for shuffling lines) rather than use sort.
>
> function shuffleLines pSource
> put empty into tNew
> put the number of lines of pSource into tNum
> repeat with n = tNum down to 1
> put random(n) into tRand
> put line tRand of pSource & cr after tNew
> delete line tRand of pSource
> end repeat
> return line 1 to -1 of tNew
> end shuffleLines
>
> Probably a little slow for large lists, but for things like shuffling answer choices in a test, it's good enough.
>
> Cheers
> Dave
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
More information about the use-livecode
mailing list