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