Re: discrete frequency distribution
- To: mathgroup at smc.vnet.net
- Subject: [mg43450] Re: discrete frequency distribution
- From: mdw at ccu1.auckland.ac.nz (Michael Woodhams)
- Date: Wed, 17 Sep 2003 07:59:13 -0400 (EDT)
- References: <bhaa1e$kkr$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Jan Schmedes <schmedes at rz.uni-potsdam.de> wrote in message news:<bhaa1e$kkr$1 at smc.vnet.net>...
> dear group,
>
> i have a set of points which describe a varaible and his frequency, e.g.
> counting the age of N people in "age-bins" 0-10 a,10-20 a,20-30 a,... .
> Given this discrete frequency distribution i want to produce random
> numbers.
> How could i do this?
>
> Thank you for help
>
> Jan Schmedes
I only found this thread because I was searching the group for the
answer to the same question, so sorry that this is a bit late.
Here is my solution:
discreteRandom[c_List] := With[{r = Random[]},
Position[c, x : _ /; x > r, 1, 1]
];
discreteRandomN[c_List, n_Integer /; n > 0] := Module[{counts},
counts = Table[0, {Length[c]}];
Map[counts[[#]]++ &, Flatten[Table[discreteRandom[c],{n}]]];
Return[counts];
];
and called as like so, where the vector is the cumulative distribution
function:
In[314]:=discreteRandomN[{0.1, 0.3, 0.6, 1.0}, 10000]
Out[314]:={1033, 2010, 2996, 3961}
As written, discreteRandom annoyingly returns something like "{{2}}"
instead of "2". This doesn't bother me, as I only intend to access it
through discreteRandomN, not directly, but if you prefer to remove
this wart:
discreteRandom[c_List] := With[{r = Random[]},
Position[c, x : _ /; x > r, 1, 1][[1]][[1]]
];
discreteRandomN[c_List, n_Integer /; n > 0] := Module[{counts},
counts = Table[0, {Length[c]}];
Map[counts[[#]]++ &, Table[discreteRandom[c],{n}]];
Return[counts];
];
If you have a the non-cumulative frequencies (i.e. "{0.1,0.2,0.3,0.4}"
in the above example) you can convert with:
cumulative = Table[Sum[nonCumulative[[j]], {j, 1, i}], {i, 1,
Length[nonCumulative]}];
Comments on efficiency and style are welcome - I haven't been at this
for long. (Yes, I know I could say "counts" instead of
"Return[counts];" but I prefer an explicit return from any
multi-statement function.)
If you want to send me e-mail, I am currently at massey.ac.nz,
username M.D.Woodhams.
-- Quattour res in hoc mundo sanctae sunt: libri, liberi, libertas et
liberalitas.