Scott, Ricardo, great thoughts and great code. It is an interesting issue
with many attack vectors; I hope the OP is getting something out of all
this...

I will expect at least as much code and analysis for my next posted problem!
;)


SEAN O
_________
http://www.sean-o.com
http://twitter.com/seanodotcom




Scott Sauyet-3 wrote:
> 
> 
> ricardobeat wrote:
>> If you need performance, this should be it:
>> 
>> http://jsbin.com/uvuzi/edit
>> 
>> It sorts the rows using the "Fisher-Yates" shuffling algorithm.
>> Despite throwing elements around in an array, it's faster than the
>> pure mathematical solution because you don't need to filter out
>> duplicate random numbers. An even greater improvement can be made by
>> using the style.display property directly.
> 
> First of all, thanks for your code.  I learned something new today.  I 
> never realized that I could reassign the elements of a jQuery collection 
> in that manner.
> 
> I don't know why I brought up performance for a client-side JavaScript 
> issue!  It's probably not at all relevant to the OP's problem.  But I 
> think both your technique and mine should have similar performance.  The 
> key factor in either of ours is the number of calls to Math.random(), 
> and both of us call that $rows.length times.
> 
> Sean O's technique has a worst-case time that is infinite, but it, or a 
> slight modification of it [1], has an expected time much shorter than 
> either of ours.  In the ten-out-of-fifty case we were working with, our 
> techniques require 50 iterations, where in his the expected number of 
> iterations is 11.033.  In your ten-out-of-one-thousand example, ours 
> would be 1000, and his expected number is below 10.05.  With the 
> modification [1], the worst case would be if the number to be selected 
> were half of the total rows, and then the number of iterations seems to 
> be about ln(2) * $rows.length, although I haven't attempted to prove this.
> 
> This is related to the Coupon Collector's Problem [2].  I'm pretty sure 
> the exact expected number of iterations of Sean's technique is
> 
>      sum_{i=1}^{SELECTED} {TOTAL / (TOTAL - i + 1)}
> 
> But hey, let's get back to jQuery!  :-)
> 
>    -- Scott
> 
> 
> [1] The modification would be, when the requested number of rows is 
> greater than half the total number of rows, to switch to running the 
> same algorithm to choose the number of *unselected* rows.
> 
> [2] http://www.google.com/search?q=coupon+collector+problem
> 
> 

-- 
View this message in context: 
http://www.nabble.com/show-hide-random-rows-tp22570300s27240p22599424.html
Sent from the jQuery General Discussion mailing list archive at Nabble.com.

Reply via email to