Indeed you are correct. The maths is simple (even if not very obvious or intuitive).

Sorting N lines by random(K)

The likelihood of swapping any two lines *should* be 1/2, but (because the sort is stable, and because they are random *integers*), there is a 1/K chance of the two random values rounding to the same integer, and hence the actual probability is (1-1/K)/2 and the probability of not swapping is (1+1/K)/2

So in Geoff's example (N=2, K=2) gives probabilities of (1-0.5)/2 i.e. 1/4 and 3/4

Changing K to 3 would make a slight improvement - 1/3 and 2/3
at K=4 we get 3/8 and 5/8, etc.
so by the time K=1000

Interestingly, the poor performance for low values of K is completely independent of N - it's just easier to see it for very small values of N.

If you set N to 5, you want to get an even spread of results, each with a probability of 8.333/1000
In fact with K=2 you get a range from 0 to 180/1000

So - random() works just fine - but using it correctly is harder than you might expect. I think it would be worth a feature request to make it much less likely that the innocent will fall into the many pitfalls.

-- Alex.

On 23/05/2013 20:30, Geoff Canyon wrote:
There is, indeed much confusion here. I, of course, am correct ;-)

I simplified the problem to a list of two items:

1,2

That way the sort command has exactly two outcomes. It either reverses the
list, or it doesn't. The two outcomes should happen roughly 50% of the
time. This script demonstrates that sorting by a large random number works,
and sorting by a random number up to the number of items (2) does not.

on mouseUp
    put "1,2" into originalList
    repeat 10000
       put originalList into newList
       sort items of newList by random(2)
       if newList is originalList then add 1 to sameCount1
    end repeat
    repeat 10000
       put originalList into newList
       sort items of newList by random(999999999)
       if newList is originalList then add 1 to sameCount2
    end repeat
    put "Sorting by random(2) kept the same order" && sameCount1 && "out of
10000 times." & cr & \
          "Sorting by random(999999999) kept the same order" && sameCount2
&& "out of 10000 times."
end mouseUp

For anyone interested in the math, as you would expect, the random numbers
for the sort come out 2,1 roughly 1/4 of the time, so the result is that
the list is in the same order roughly 75% of the time when using random(2).
Here's one result I got:

Sorting by random(2) kept the same order 7514 out of 10000 times.
Sorting by random(999999999) kept the same order 5014 out of 10000 times.

If anyone disagrees, come at me, bro. ;-)
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode


_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to