I simplified the expression but didn't change the comment.  It should include 

...i/k is 1 for only i=k.


On May 23, 2013, at 4:31 PM, Dar Scott wrote:

> I did a math.  
> 
> The probability of the first element not moving for a k item list named 
> myList that is sorted by
> 
>   sort items of myList by random( the number of items of myList )
> 
> is p(k) where
> 
> p(k) = sum with i from 1 to k of 1/k  *  ( i/k ) ^ (k-1)
> 
> That power increasing with k tends to make numbers less than one smaller, but 
> 1 stays the same, so p(k) approaches 1/k as k goes up since (k+1-i)/k is 1 
> for only i=1.  
> 
> This essentially looks at the probability of the first element not moving for 
> each case of its assignment by random (the sum) and each of those depends on 
> the rest of the assignments being the same or higher.  
> 
> That seems to work for 1, 2 and 3.  
> 
> (This hasn't been blessed by Geoff yet, so don't file this as True, yet.)
> 
> Dar
> 
> 
> 
> 
> On May 23, 2013, at 2:43 PM, Alex Tweedly wrote:
> 
>> 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
> 
> 
> _______________________________________________
> 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