1. random numbers
- Posted by Allen Ashby <allenannashby at c??cast.net> Nov 22, 2007
- 614 views
I am trying to generate 52 random numbers 1-52 without duplicating any numbers. it seems every time I try I get duplications. Does anyone have a solution for this. Thanks Allen
2. Re: random numbers
- Posted by Derek Parnell <ddparnell at bigpo?d.?om> Nov 22, 2007
- 576 views
Allen Ashby wrote: > > > I am trying to generate 52 random numbers 1-52 without duplicating any > numbers. > it seems every time I try I get duplications. Does anyone have a > solution for this. > include misc.e function Shuffle() sequence ShuffledDeck integer temp ShuffledDeck = {} while length(ShuffledDeck) < 52 do temp = rand(52) if not find(temp, ShuffledDeck) then ShuffledDeck &= temp end if end while return ShuffledDeck end function -- Unit tests sequence test if find("--unittest", command_line()) then puts(2, "Doing unit testing\n") test = Shuffle() if length(test) != 52 then printf(2, "Length is %d and not 52\n", length(test)) end if for i = 1 to length(test) do if find(test[i], test[i+1..$]) then printf(2, "Dup %d at %d\n", {test[i], i}) end if end for end if -- Derek Parnell Melbourne, Australia Skype name: derek.j.parnell
3. Re: random numbers
- Posted by c.k.lester <euphoric at ckle?t?r.com> Nov 22, 2007
- 577 views
Allen Ashby wrote: > > I am trying to generate 52 random numbers 1-52 without duplicating any > numbers. > it seems every time I try I get duplications. Does anyone have a > solution for this. Start with a sequence {1..52} and pull them from that. s = {1,2,3,4,5,6,7,8,9,...52} n = {} for t=1 to 52 do r = rand(length(s)) -- grab a random position n &= s[r] -- add it to our new sequence s = s[1..r-1] & s[r+1..$] -- remove from available numbers end for
4. Re: random numbers
- Posted by c.k.lester <euphoric at c?les?er.com> Nov 22, 2007
- 585 views
Derek Parnell wrote: > function Shuffle() > sequence ShuffledDeck > integer temp > ShuffledDeck = {} > while length(ShuffledDeck) < 52 do > temp = rand(52) > if not find(temp, ShuffledDeck) then > ShuffledDeck &= temp > end if > end while > return ShuffledDeck > end function Wouldn't that possibly take too long generating the last number? You have a 51 out of 52 chance of picking a number the already exists. Nevermind... here's a test:
include misc.e include get.e function Shuffle() sequence ShuffledDeck integer temp ShuffledDeck = {} while length(ShuffledDeck) < 52 do temp = rand(52) if not find(temp, ShuffledDeck) then ShuffledDeck &= temp end if end while return ShuffledDeck end function function shuff() sequence s, n integer r s = {} for t=1 to 52 do s &= t end for n = {} for t=1 to 52 do r = rand(length(s)) -- grab a random position n &= s[r] -- add it to our new sequence s = s[1..r-1] & s[r+1..$] -- remove from available numbers end for return n end function atom c, t sequence test c=0 t = time() + 3 while t > time() do test = Shuffle() c += 1 end while ?c c = 0 t = time() + 3 while t > time() do test = shuff() c += 1 end while ?c if wait_key() then end if
5. Re: random numbers
- Posted by c.k.lester <euphoric at c?lester.co?> Nov 22, 2007
- 564 views
Derek Parnell wrote: > function Shuffle() > sequence ShuffledDeck > integer temp > ShuffledDeck = {} > while length(ShuffledDeck) < 52 do > temp = rand(52) > if not find(temp, ShuffledDeck) then > ShuffledDeck &= temp > end if > end while > return ShuffledDeck > end function Wouldn't that possibly take too long generating the last number? You have a 51 out of 52 chance of picking a number the already exists. Nevermind... here's a test:
include misc.e include get.e constant fittytwo = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52} function Shuffle() sequence ShuffledDeck integer temp ShuffledDeck = {} while length(ShuffledDeck) < 52 do temp = rand(52) if not find(temp, ShuffledDeck) then ShuffledDeck &= temp end if end while return ShuffledDeck end function function shuff() sequence s, n integer r s = {} for t=1 to 52 do s &= t end for n = {} for t=1 to 52 do r = rand(length(s)) -- grab a random position n &= s[r] -- add it to our new sequence s = s[1..r-1] & s[r+1..$] -- remove from available numbers end for return n end function function shuff2() sequence s, n integer r s = repeat(0,52) for t=1 to 52 do s[t] = t end for n = {} for t=1 to 52 do r = rand(length(s)) -- grab a random position n &= s[r] -- add it to our new sequence s = s[1..r-1] & s[r+1..$] -- remove from available numbers end for return n end function function shuff3() sequence s, n integer r s = fittytwo n = {} for t=1 to 52 do r = rand(length(s)) -- grab a random position n &= s[r] -- add it to our new sequence s = s[1..r-1] & s[r+1..$] -- remove from available numbers end for return n end function atom c, t sequence test c=0 puts(1,"Starting test...\n\n") t = time() + 3 while t > time() do test = Shuffle() c += 1 end while ?c c = 0 t = time() + 3 while t > time() do test = shuff() c += 1 end while ?c c = 0 t = time() + 3 while t > time() do test = shuff2() c += 1 end while ?c c = 0 t = time() + 3 while t > time() do test = shuff3() c += 1 end while ?c if wait_key() then end if
6. Re: random numbers
- Posted by c.k.lester <euphoric at ?k?ester.com> Nov 22, 2007
- 583 views
Sorry for the double-post... The first one didn't seem to go through and I figured out faster ways to go... OpenEuphoria.org is acting up a lot lately. :(
7. Re: random numbers
- Posted by Jason Gade <jaygade at ?ahoo.co?> Nov 22, 2007
- 562 views
c.k.lester wrote: > > Allen Ashby wrote: > > > > I am trying to generate 52 random numbers 1-52 without duplicating any > > numbers. > > it seems every time I try I get duplications. Does anyone have a > > solution for this. > > Start with a sequence {1..52} and pull them from that. > > s = {1,2,3,4,5,6,7,8,9,...52} > n = {} > for t=1 to 52 do > r = rand(length(s)) -- grab a random position > n &= s[r] -- add it to our new sequence > s = s[1..r-1] & s[r+1..$] -- remove from available numbers > end for This would have been my solution as well. Nice! I would only change it slightly:
s = {1,2,3,4,5,6,7,8,9,...52} n = repeat(0, 52) for t=1 to 52 do r = rand(length(s)) -- grab a random position n[t] = s[r] -- add it to our new sequence s = s[1..r-1] & s[r+1..$] -- remove from available numbers end for
-- A complex system that works is invariably found to have evolved from a simple system that works. --John Gall's 15th law of Systemantics. "Premature optimization is the root of all evil in programming." --C.A.R. Hoare j.
8. Re: random numbers
- Posted by c.k.lester <euphoric at ck?ester.?om> Nov 22, 2007
- 598 views
Jason Gade wrote: > I would only change it slightly: > }}} <eucode> > s = {1,2,3,4,5,6,7,8,9,...52} > n = repeat(0, 52) > for t=1 to 52 do > r = rand(length(s)) -- grab a random position > n[t] = s[r] -- add it to our new sequence > s = s[1..r-1] & s[r+1..$] -- remove from available numbers > end for > </eucode> {{{ Good eye! :)
9. Re: random numbers
- Posted by jiri babor <jbabor at pa?adis?.net.nz> Nov 22, 2007
- 562 views
sequence s function shuffle(sequence s) -- random shuffle of sequence object temp integer r for i = length(s) to 2 by -1 do r = rand(i) temp = s[r] s[r] = s[i] s[i] = temp end for return s end function s = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52} s = shuffle(s)
10. Re: random numbers
- Posted by Derek Parnell <ddparnell at bigp?nd.c?m> Nov 22, 2007
- 573 views
c.k.lester wrote: > Wouldn't that possibly take too long generating the last number? You have a > 51 out of 52 chance of picking a number the already exists. Nevermind... > here's a test: Well no one mentioned that speed was an issue. I just tried to demonstrate a simple algorithm, I wasn't after speed. However, if you want speed, try this adjustment to your fastest routine ... function shuff4() sequence s, n integer r s = fittytwo n = repeat(0,52) for t=52 to 2 by -1 do r = rand(t) -- grab a random position n[t] = s[r] -- add it to our new sequence s[r..51] = s[r+1..52]-- remove from available numbers end for n[1] = s[1] return n end function On my machine I get ... shuff: 20-22% improvement shuff2: 24-27% improvement shuff3: 25-30% improvement shuff4: 85-95% improvement The shuff4() routine avoids unnecessary calculations, and memory allocations and deallocations. -- Derek Parnell Melbourne, Australia Skype name: derek.j.parnell
11. Re: random numbers
- Posted by Derek Parnell <ddparnell at big??nd.com> Nov 22, 2007
- 570 views
jiri babor wrote: Hey jiri! I knew I should have left it to the master. Your routine is about 385% faster than my first try. It is the same as mine but very sensibly reuses the very sequence that is being shuffled for the result storage. That really eliminates all the excess memory allocation and moving stuff about. ... if only there was a built-in swap operation for even faster run times. function shuffle(sequence s) -- random shuffle of sequence integer r for i = length(s) to 2 by -1 do r = rand(i) swap s[r] with s[i] !!! end for return s end function -- Derek Parnell Melbourne, Australia Skype name: derek.j.parnell
12. Re: random numbers
- Posted by jiri babor <jbabor at p?radise.net?nz> Nov 22, 2007
- 593 views
Yes, Derek, a built-in swap function would be more useful than endless discussions how to simulate a simple goto with a dozen fancy constructs... jiri
13. Re: random numbers
- Posted by CChris <christian.cuvier at agricult?re.go?v.fr> Nov 22, 2007
- 584 views
Derek Parnell wrote: > > jiri babor wrote: > > Hey jiri! I knew I should have left it to the master. Your routine is about > 385% faster than my first try. It is the same as mine but very sensibly reuses > the very sequence that is being shuffled for the result storage. That really > eliminates all the excess memory allocation and moving stuff about. > > ... if only there was a built-in swap operation for even faster run times. > > function shuffle(sequence s) -- random shuffle of sequence > integer r > for i = length(s) to 2 by -1 do > r = rand(i) > swap s[r] with s[i] !!! > end for > return s > end function > > -- > Derek Parnell > Melbourne, Australia > Skype name: derek.j.parnell Shuffling algorithm: nothing to add, solved optimally while I was sleeping. Swap operation: I am not sure swap(sequence s,integer index1,integer index2) would be much faster than current
temp=s[index1] implicit_temp=s[index2] s[index1]=implicit_temp s[index2]=temp
because of the overhead of routine calls. At the machine level, you can of course shave implicit_temp using the three XCHG trick: <asm> xchg eax,[ebx+esi] wchg eax,[ebx+edi] xchg eax,[ebx+esi] </asm> with obvious register usage. I don't know if supported C compilers can apply it, and it wouldn't work on non Intel CPUs (ARM processor standard architecture doesn't have an XCHG instruction). What would speed up some tasks is a builtin move_right(sequence s,integer start_slice,integer end_slice,integer how_much). Currently you have to do this by creating temporary slices:
temp=s[end_slice+1..end_slice+how_much] s[start_slice+how_much..end_slice+how_much]=s[start_slice..end_slice] s[start_slice..start_slice+how_much-1]=temp
In the backend you just need EMalloc()ing some memory for the end portion, three memcpy() and an EFree(). Wraparounds should probably trigger a runtime error, but could be handled with a couple more memcpy() calls. Of course negative values for how_much would be allowed. CChris
14. Re: random numbers
- Posted by Derek Parnell <ddparnell at big?on?.com> Nov 22, 2007
- 593 views
CChris wrote: > > Derek Parnell wrote: >> ... if only there was a built-in swap operation for even faster run times. >> swap s[r] with s[i] !!! > > Swap operation: I am not sure swap(sequence s,integer index1,integer index2) > would be much faster than current > }}} <eucode> > temp=s[index1] > implicit_temp=s[index2] > s[index1]=implicit_temp > s[index2]=temp > </eucode> {{{ > because of the overhead of routine calls. I said swap OPERATION and not swap FUNCTION. The idea being that there would be an in-built operation, like the arithmetic operations, that performs optimal swap functionality so we wouldn't have a function call overhead. -- Derek Parnell Melbourne, Australia Skype name: derek.j.parnell
15. Re: random numbers
- Posted by Bernie Ryan <xotron at bl?e?rog.com> Nov 22, 2007
- 592 views
Derek Parnell wrote: > > > I said swap OPERATION and not swap FUNCTION. The idea being that there would > be an in-built operation, like the arithmetic operations, that performs > optimal > swap functionality so we wouldn't have a function call overhead. > > -- Derek: A suggestion for a swap operator to swap two variable: first_variable >< second_variable Bernie My files in archive: WMOTOR, XMOTOR, W32ENGIN, MIXEDLIB, EU_ENGIN, WIN32ERU, WIN32API Can be downloaded here: http://www.rapideuphoria.com/cgi-bin/asearch.exu?dos=on&win=on&lnx=on&gen=on&keywords=bernie+ryan
16. Re: random numbers
- Posted by c.k.lester <euphoric at c?lester.co?> Nov 22, 2007
- 568 views
Derek Parnell wrote: > function shuff4() > ... > end function > > On my machine I get ... > > shuff: 20-22% improvement > shuff2: 24-27% improvement > shuff3: 25-30% improvement > shuff4: 85-95% improvement > > The shuff4() routine avoids unnecessary calculations, and memory allocations > and deallocations. That's awesome, Derek!
17. Re: random numbers
- Posted by c.k.lester <euphoric at c?le?ter.com> Nov 22, 2007
- 554 views
Derek Parnell wrote: > Hey jiri! I knew I should have left it to the master. Your routine is about > 385% faster than my first try. Yeah, Jiri's is fast! So, how do you measure randomness? I know there are tests for it. I'm wondering if jiri's algorithm allows for every possible permutation. I sped up your original first try, Derek. Look at shuff3(). But I don't know if that ruins the algorithm or messes with the randomness. Here's an updated look:
include misc.e include get.e constant fittytwo = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52} sequence tests tests = {{},{}} procedure add_test(sequence name, atom id) tests[1] = append(tests[1],name) tests[2] &= id end procedure function shuff1() sequence s, n integer r s = fittytwo n = repeat(0,52) for t=1 to 52 do r = rand(length(s)) -- grab a random position n[t] = s[r] -- add it to our new sequence s = s[1..r-1] & s[r+1..$] -- remove from available numbers end for return n end function function shuff3() sequence s, n integer r s = fittytwo n = repeat(0,52) for t=52 to 2 by -1 do r = rand(t) -- grab a random position n[t] = s[r] -- add it to our new sequence s[r..51] = s[r+1..52]-- remove from available numbers end for n[1] = s[1] return n end function function shuff4() sequence s, n integer r s = fittytwo n = repeat(0,52) for t=52 to 2 by -1 do r = rand(t) -- grab a random position n[t] = s[r] -- add it to our new sequence s[r..t-1] = s[r+1..t]-- remove from available numbers -- Derek, this is what I changed end for n[1] = s[1] return n end function function shuff5() object temp integer r sequence s s = fittytwo for i = length(s) to 2 by -1 do r = rand(i) temp = s[r] s[r] = s[i] s[i] = temp end for return s end function procedure run_tests() atom c, t sequence test integer secs for x=1 to length( tests[1]) do c=0 secs = 1 puts(1,"Starting test " & tests[1][x] & "\n") t = time() + secs while t > time() do test = call_func(tests[2][x],{}) c += 1 end while ?test printf(1,"\t%d\n\n",{c}) end for end procedure add_test("Baseline",routine_id("shuff1")) add_test("Derek's First",routine_id("shuff3")) add_test("Derek's First Modified",routine_id("shuff4")) add_test("Jiri's Speed Demon",routine_id("shuff5")) run_tests() puts(1,"\nDone! Press any key to quit.") if wait_key() then end if
18. Re: random numbers
- Posted by c.k.lester <euphoric at c?lest?r.com> Nov 22, 2007
- 565 views
c.k.lester wrote: > > I sped up your original first try, Derek. Look at shuff3(). Obviously I meant shuff4(). :)
19. Re: random numbers
- Posted by Ricardo Forno <ricardoforno at tuto?ia.?om> Nov 22, 2007
- 584 views
c.k.lester wrote: > > Derek Parnell wrote: > > Hey jiri! I knew I should have left it to the master. Your routine is about > > 385% faster than my first try. > > Yeah, Jiri's is fast! So, how do you measure randomness? > I know there are tests for it. I'm wondering if jiri's algorithm allows for > every possible permutation. I sped up your original first try, Derek. Look > at shuff3(). But I don't know if that ruins the algorithm or messes with > the randomness. > > Here's an updated look: > > }}} <eucode>include misc.e > include get.e > > constant fittytwo = > {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52} > > sequence tests > tests = {{},{}} > > procedure add_test(sequence name, atom id) > tests[1] = append(tests[1],name) > tests[2] &= id > end procedure > > function shuff1() > sequence s, n > integer r > s = fittytwo > n = repeat(0,52) > for t=1 to 52 do > r = rand(length(s)) -- grab a random position > n[t] = s[r] -- add it to our new sequence > s = s[1..r-1] & s[r+1..$] -- remove from available numbers > end for > return n > end function > > function shuff3() > sequence s, n > integer r > s = fittytwo > n = repeat(0,52) > for t=52 to 2 by -1 do > r = rand(t) -- grab a random position > n[t] = s[r] -- add it to our new sequence > s[r..51] = s[r+1..52]-- remove from available numbers > end for > n[1] = s[1] > return n > end function > > function shuff4() > sequence s, n > integer r > s = fittytwo > n = repeat(0,52) > for t=52 to 2 by -1 do > r = rand(t) -- grab a random position > n[t] = s[r] -- add it to our new sequence > s[r..t-1] = s[r+1..t]-- remove from available numbers -- Derek, this is > what I changed > end for > n[1] = s[1] > return n > end function > > function shuff5() > object temp > integer r > sequence s > s = fittytwo > for i = length(s) to 2 by -1 do > r = rand(i) > temp = s[r] > s[r] = s[i] > s[i] = temp > end for > return s > end function > > procedure run_tests() > atom c, t > sequence test > integer secs > > for x=1 to length( tests[1]) do > c=0 > secs = 1 > > puts(1,"Starting test " & tests[1][x] & "\n") > > t = time() + secs > while t > time() do > test = call_func(tests[2][x],{}) > c += 1 > end while > ?test > printf(1,"\t%d\n\n",{c}) > end for > > end procedure > > add_test("Baseline",routine_id("shuff1")) > add_test("Derek's First",routine_id("shuff3")) > add_test("Derek's First Modified",routine_id("shuff4")) > add_test("Jiri's Speed Demon",routine_id("shuff5")) > > run_tests() > > puts(1,"\nDone! Press any key to quit.") > if wait_key() then end if</eucode> {{{ An almost identical routine is included in my General Functions package. Here it is: --/topic STATISTICS / PROBABILITIES ROUTINES --/func Scramble(sequence s) --/desc Scrambles, that is, disorders a sequence --/ret The argument in random order --Returns sequence 's' scrambled, that is, the resulting sequence contains -- the elements of 's' in random order. --Example: Scramble("Mandrake") might give "kadnMare" global function Scramble(sequence s) integer len, k object temp len = length(s) for i = 1 to len do k = rand(len) temp = s[k] s[k] = s[i] s[i] = temp end for return s end function I later learnt that Donald Knuth was probably the first one to design this algorithm, and that he showed it really randomly ordered (or disordered ) a sequence. Regards.
20. Re: random numbers
- Posted by CChris <christian.cuvier at ag?i?ulture.gouv.fr> Nov 22, 2007
- 586 views
Derek Parnell wrote: > > CChris wrote: > > > > Derek Parnell wrote: > >> ... if only there was a built-in swap operation for even faster run times. > >> swap s[r] with s[i] !!! > > > > > Swap operation: I am not sure swap(sequence s,integer index1,integer index2) > > would be much faster than current > > }}} <eucode> > > temp=s[index1] > > implicit_temp=s[index2] > > s[index1]=implicit_temp > > s[index2]=temp > > </eucode> {{{ > > because of the overhead of routine calls. > > I said swap OPERATION and not swap FUNCTION. The idea being that there would > be an in-built operation, like the arithmetic operations, that performs > optimal > swap functionality so we wouldn't have a function call overhead. > > -- > Derek Parnell > Melbourne, Australia > Skype name: derek.j.parnell Ok, this will avoid the overhead of the call. Yet I wonder how much speed you can gain this way wrt current sequene of assignments. At least you'll gain clearer code - not a small benefit. CChris
21. Re: random numbers
- Posted by Jason Gade <jaygade at ya?oo.?om> Nov 22, 2007
- 577 views
jiri babor wrote: > > sequence s > > function shuffle(sequence s) -- random shuffle of sequence > object temp > integer r > for i = length(s) to 2 by -1 do > r = rand(i) > temp = s[r] > s[r] = s[i] > s[i] = temp > end for > return s > end function > > s = > {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52} > s = shuffle(s) Good to see you, jiri! Derek Parnell wrote: > > c.k.lester wrote: > > Wouldn't that possibly take too long generating the last number? You have a > > 51 out of 52 chance of picking a number the already exists. Nevermind... > > here's a test: > > Well no one mentioned that speed was an issue. I just tried to demonstrate a > simple algorithm, I wasn't after speed. However, if you want speed, try this > adjustment to your fastest routine ... > > function shuff4() > sequence s, n > integer r > s = fittytwo > n = repeat(0,52) > for t=52 to 2 by -1 do > r = rand(t) -- grab a random position > n[t] = s[r] -- add it to our new sequence > s[r..51] = s[r+1..52]-- remove from available numbers > end for > n[1] = s[1] > return n > end function I never thought that speed was an issue myself -- I just thought that it was a simpler or more elegant way of doing things. Yes, jiri's is best though. jiri babor wrote: > > Yes, Derek, a built-in swap function would be more useful than endless > discussions > how to simulate a simple goto with a dozen fancy constructs... > > jiri Well, while I'm one of the "anti-gotos" and prefer a few clear constructs instead, I think that there are quite a few interesting sequence operations that I would like to see built-in to the interpreter. Then again, we always discuss them and never come to any kind of consensus. Does any other compiled or interpreted language have a built-in swap? I can't recall coming across one, even though it is a pretty common operation. -- A complex system that works is invariably found to have evolved from a simple system that works. --John Gall's 15th law of Systemantics. "Premature optimization is the root of all evil in programming." --C.A.R. Hoare j.
22. Re: random numbers
- Posted by Juergen Luethje <j.lue at g?x.d?> Nov 22, 2007
- 578 views
- Last edited Nov 23, 2007
Hello Ricardo, you wrote: <snip> > An almost identical routine is included in my General Functions package. > Here it is: > > --/topic STATISTICS / PROBABILITIES ROUTINES > --/func Scramble(sequence s) > --/desc Scrambles, that is, disorders a sequence > --/ret The argument in random order > --Returns sequence 's' scrambled, that is, the resulting sequence contains > -- the elements of 's' in random order. > --Example: Scramble("Mandrake") might give "kadnMare" > global function Scramble(sequence s) > integer len, k > object temp > len = length(s) > for i = 1 to len do > k = rand(len) > temp = s[k] > s[k] = s[i] > s[i] = temp > end for > return s > end function > > I later learnt that Donald Knuth was probably the first one to design > this algorithm, and that he showed it really randomly ordered > (or disordered ) As far as I can see, your Scramble() function above is _not_ a correct implementation of the so-called Knuth shuffle (see e.g. <http://en.wikipedia.org/wiki/Knuth_shuffle>). On that page, in the chapter "Implementation errors" it reads: | Similarly, always selecting k from the entire range of valid array | indexes [...] also produces a result which is biased, albeit less | obviously so. This can be seen from the fact that doing so yields N^N | distinct possible sequences of swaps, whereas there are only N! | possible permutations of an N-element array. Since N^N can never be | evenly divisible by N! (as the latter is divisible by N−1, which shares | no prime factors with N), some permutations must be produced by more of | the NN sequences of swaps than others. Fernando Bauer already had written something similar some months ago: <http://www.openeuphoria.org/cgi-bin/esearch.exu?fromMonth=6&fromYear=1&toMonth=B&toYear=C&postedBy=&keywords=pigeonhole> According to my understanding, the code posted here by Jiri Babor is a correct implementation of the Knuth shuffle. Regards, Juergen
23. Re: random numbers
- Posted by Juergen Luethje <j.lue at g??.de> Nov 22, 2007
- 585 views
- Last edited Nov 23, 2007
Hi Jason, you wrote: <snip> > Does any other compiled or interpreted language have a built-in swap? Oh yes, oh yes! > I can't > recall coming across one, even though it is a pretty common operation. It is implemented in many BASIC flavours: SWAP a, b Also interesting in this regard is Lua. Lua allows multiple assignment in one command, e.g.: a, b = 1, 3 which is the same as: a = 1 b = 3 This feature can be used for swapping: a, b = b, a No joke, that actually works fine in Lua. Cool, no? Regards, Juergen
24. Re: random numbers
- Posted by Jason Gade <jaygade at y?ho?.com> Nov 22, 2007
- 579 views
- Last edited Nov 23, 2007
Juergen Luethje wrote: > > Hi Jason, > > you wrote: > > <snip> > > > Does any other compiled or interpreted language have a built-in swap? > > Oh yes, oh yes! > > > I can't > > recall coming across one, even though it is a pretty common operation. > > It is implemented in many BASIC flavours: > SWAP a, b Heh. The last time that I wrote in BASIC was on an 8-bit machine and it required line numbers. > Also interesting in this regard is Lua. Lua allows multiple assignment > in one command, e.g.: > a, b = 1, 3 > which is the same as: > a = 1 > b = 3 > > This feature can be used for swapping: > a, b = b, a > > No joke, that actually works fine in Lua. Cool, no? > > Regards, > Juergen I've always thought that Lua was a pretty cool implementation of Euphoria... ;) -- A complex system that works is invariably found to have evolved from a simple system that works. --John Gall's 15th law of Systemantics. "Premature optimization is the root of all evil in programming." --C.A.R. Hoare j.
25. Re: random numbers
- Posted by Ricardo Forno <ricardoforno at t?t?pia.com> Nov 22, 2007
- 563 views
- Last edited Nov 23, 2007
Yes, Juergen. My method is biased. I thought it was identical to Knuth's, but it wasn't, as you pointed out. I will change it next time I post a modified General Functions. Best regards.