On 2017-05-17, at 18:18, Robin Vowels wrote: > >>> This takes O(n) time, as opposed to O(n log n) for Peter's >>> "generate and sort" method. With only 99,999 numbers the extra CPU time >>> may not be significant, depending on how often you need to generate >>> a sequence. >> Presuming that the table fits in main memory. On the first mainframes >> I used, 99,999 wouldn't have fit. > > You don't need to store all the numbers. > One buit for each number was sufficient. > Are you thinking of something like: 557 $ cat perm /* Rexx */ signal on novalue; /* Generate random pemutation of N objects. */ N = 99999 /* Size of list. */ Mark. = 1
Found = 0; do I = 1 /* I counts probes. */ R = random( 1, N ) if Mark.R then do Found = Found + 1 /* Count successes. */ Mark.R = 0 say right( I, 11 ) right( Found, 6 ) right( R, 6 ); end if Found>= N; then leave I; end I return( 0 ) OK. I was afraid it would have an unacceptable quadratic behavior https://en.wikipedia.org/wiki/Joel_Spolsky#Schlemiel_the_Painter.27s_algorithm ... but for 99,999 entries it's pretty good: ... 1025726 99997 70050 1042922 99998 86816 1287281 99999 20208 real 0m2.704s user 0m2.031s sys 0m0.281s -- gil