Re: A conditional random number generation problem (please help me!)
- To: mathgroup at smc.vnet.net
- Subject: [mg65677] Re: A conditional random number generation problem (please help me!)
- From: dh <dh at metrohm.ch>
- Date: Fri, 14 Apr 2006 04:32:03 -0400 (EDT)
- References: <e1ijuv$3oh$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi, if I understand correctly, you want a random number generator that gives numbers in [a,b] with a given density P. This is a bit tricky. First note that to make life easier we can assume that the interval is [0,1]. This can then be mapped to [a,b] by: a+x(b-a) Further, Random[] gives random numbers in [0,1] uniformly distributed with density c (==constant). We are looking for a function F[x] that mappes the uniform distribution into one with the given density P[x]: y=F[x]: [0,1] -> [0,1] This must now be cast into mathematical notation. Assume we have a samll intervall dx that contains dn random numbers. This will be mapped into the interval: dy== F'[x] dx containing the same dn random numbers. Therefore, dn== P[y] dy == P[F[x]] F'[x] dx == c dx or F'[x] == c/ P[ F[x] ] That is the differential equation for F. We also want that F mappes 0-> 0 and 1->1 Let's make an example: we want a triangle distribution in [0,1]: P[x_]:= 4 c If[x<0.5, x, 1-x] the 4 c ensures that the numbers of random points stays constant. As this function has a kink at 0.5, we integrate from 0..0.5 and get the rest by symmetry. There is a further difficulty here, because P[0]==0, and 1/P[0] is indefinite. We circumvent this problem by replacing 0 by a very small number, say 10^-6. Therefore, in [0,0.5] P[x]==x and c/P[F[x]]] == 0.25/F[x] and we can solve the differential equation: fun0 = F /. NDSolve[{F'[x] == 0.25/F[x], F[0] == 10^-6}, F, {x, 0,0.5}][[1]]; fun[x_] := If[x < .5, fun0[x], 1 - fun0[1 - x]] Plot[fun[x], {x, 0, 1}] fun[x] will do the looked for mapping. We can test our result by simulation: << Graphics`Graphics` d = Table[fun[Random[Real, {0, 1}]], {10000}]; Histogram[d] Daniel rjmachado3 wrote: > I need to know the formula for the random function that return random > numbers in a range of a and b integers [a,b] but that obey on a custom > probability (possibly different!) for each integer number on this [a,b] > range (of course the sum of all integer number probabilities are = 1!). > Finally, what i want is the general function formula that simulate the > random behavior (based on a custom probability value for each integer > number between the [a,b] range. confuse? i hope not! please help me!!!! > > what i know so far is that the function formula for generating a "pure" > random number between [a,b] range is: > > rand()*(b-a)+a > > where rand() return a random number between 0 and 1. >