Re: need little help - no longer!(2)
- To: mathgroup at smc.vnet.net
- Subject: [mg23655] Re: [mg23530] need little help - no longer!(2)
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sun, 28 May 2000 23:09:06 -0400 (EDT)
- References: <8g9nm8$mmd@smc.vnet.net> <8gfuar$br7@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Mark Fisher has pointed out some problems with the brackets in code for the function pickRandom in my earlier posting. I have corrected these below; speeded the code up a little and brought the output more into line with the other two functions in the previous posting. I have also added a step-by-step version of the calculation. pickRandom[m_] := With[{m2 = Rest[FoldList[Plus, 0, m]]}, Last[Transpose[Sort[Join @@ (Map[Last, Split[Sort[ Join[ Transpose[{Table[Random[], {#}], Range[#]}], Thread[List[m2, List /@ Range[Length[m]]]] ]], MatchQ[#1, {_, _Integer}] & ], {2} ] /. {{x__, {p_Integer}} :> Thread[List[{x}, p]], {{_}} -> Sequence[] }) ]] ] & ] EXAMPLES m = #/(Plus @@ #) &[Table[Random[], {500}]]; SeedRandom[1]; pickRandom[m][10] SeedRandom[1]; pickRandom[m][10000]; // Timing {3, 3, 3, 1, 3, 3, 3, 3, 1, 2} {4.88 Second, Null} Pre-compute pickRandom[m] pick3 = pickRandom[m]; SeedRandom[1]; pick3[10] SeedRandom[1]; pick3[10000]; // Timing {3, 3, 3, 1, 3, 3, 3, 3, 1, 2} {4.72 Second, Null} STEP BY STEP EVALUATION m = { .3, .3, .4}; n = 8; m2 = Rest[FoldList[Plus, 0, m]] {0.3, 0.6, 1.} r1 = Thread[List[m2, List /@ Range[Length[m2]]]] {{0.3, {1}}, {0.6, {2}}, {1., {3}}} r2 = Transpose[{#, Range[Length[#]]} &[Table[Random[], {n}]]] {{0.246313, 1}, {0.464937, 2}, {0.509709, 3}, {0.146946, 4}, {0.375082, 5}, {0.873216, 6}, {0.728773, 7}, {0.787449, 8}} r3 = Sort[Join[r1, r2]] {{0.146946, 4}, {0.246313, 1}, {0.3, {1}}, {0.375082, 5}, {0.464937, 2}, {0.509709, 3}, {0.6, {2}}, {0.728773, 7}, {0.787449, 8}, {0.873216, 6}, {1., {3}}} r4 = Split[r3, MatchQ[#1, {_, _Integer}] &] {{{0.146946, 4}, {0.246313, 1}, {0.3, {1}}}, {{0.375082, 5}, {0.464937, 2}, {0.509709, 3}, {0.6, {2}}}, {{0.728773, 7}, {0.787449, 8}, {0.873216, 6}, {1., {3}}}} r5 = Map[Last, r4, {2}] {{4, 1, {1}}, {5, 2, 3, {2}}, {7, 8, 6, {3}}} r6 = r5 /. {{x__, {p_Integer}} :> Thread[List[{x}, p]], {{_}} -> Sequence[] } {{{4, 1}, {1, 1}}, {{5, 2}, {2, 2}, {3, 2}}, {{7, 3}, {8, 3}, {6, 3}}} r7 = Sort[Join @@ r6] {{1, 1}, {2, 2}, {3, 2}, {4, 1}, {5, 2}, {6, 3}, {7, 3}, {8, 3}} r8 = Last[Transpose[r7]] {1, 2, 2, 1, 2, 3, 3, 3} Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565