Re: need little help
- To: mathgroup at smc.vnet.net
- Subject: [mg23544] Re: [mg23530] need little help
- From: Ken Levasseur <Kenneth_Levasseur at uml.edu>
- Date: Sat, 20 May 2000 03:10:22 -0400 (EDT)
- Organization: UMass Lowell
- References: <200005170230.WAA22619@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Wagner: I've used a variation of the following function to illustrate pattern matching in my Mathematica class. In[8]:= m = {0.2, 0.4, 0.1, 0.3} Out[8]= {0.2, 0.4, 0.1, 0.3} In[9]:= RandomIndex[m_] := (m /. {{a__, b___} :> Length[{a}] /; Plus[a] >= #}) &[Random[]] In[10]:= Count[Table[RandomIndex[m], {1000}], #] & /@ Range[1, 4]/1000. Out[10]= {0.211, 0.397, 0.103, 0.273} ****Using an iMac DV ***** In[11]:= Timing[Table[RandomIndex[m], {1000}]] // First Out[11]= 0.3 Second Ken Levasseur UMass Lowell Instructor: the online course Introduction to Mathematica (http://www.uml.edu/dept/math/m419.html) Starts May 21! Wagner Truppel wrote: > > Howdy everyone, > > I have a list of probabilities (whose sum is 1.0), each associated > with an index. I'd like to randomly choose an index based on those > probabilities. For example, suppose > > m = {0.2, 0.4, 0.1, 0.3} > > which dictates that index 1 should be selected with prob 0.2, index 2 > with prob 0.4, index 3 with prob 0.1, and index 4 with prob 0.3. > > I've already written a function that works, but I think there should > be a simpler, more elegant, and more efficient way of accomplishing > this task. > > Here's my solution: > > randomIndexPick[ m_ ] := > Module[ { r, s }, > r = Random[]; > s = Sort[ Thread[ { m, Range[ Length[m] ] } ] ]; > s = Table[ { Sum[ s[[i, 1]], { i, 1, k } ], s[[k, 2]] }, > { k, 1, Length[m] } ]; > s = Map[ ( { r * First[#], Last[#] } ) &, s ]; > s = Select[ s, ( First[#] ) & ]; > Return[ s[[1, 2]] ] ]; > > Table[ randomIndexPick[ {0.2, 0.4, 0.1, 0.3} ], {20} ] > > {4, 4, 1, 2, 2, 4, 4, 1, 4, 4, 2, 3, 1, 2, 2, 2, 4, 3, 2, 3} > > Does anybody have a better solution? > > Thanks! > Wagner
- References:
- need little help
- From: Wagner Truppel <wtruppel@uci.edu>
- need little help