Generate random number according to any equation

2.5k Views Asked by At

So I'm after a random number generator where the probabilities of a number occurring in some range is matched to some function. Only really looking at functions with nice integrals (for simplicity sake). For example, given some quadratic

$f(x)=2x^2 $ where x $ [0,2]$

a single number should be spat out, between 0 and 2, with a higher probability of something closer to 2 being generated.

This is my approach so far. Given the same $f(x)$ as above

lower L = 0, U upper = 2.

Get some uniform random number A between L and U. So let A = 0.8.

$$p = \frac{\int_L^A f(x) dx}{\int_L^U f(x) dx}$$ $$p = \frac{\int_0^{0.8} 2x^2 dx}{\int_0^2 2x^2 dx}$$ $$p = \frac{0.3413}{5.3333}$$ $$p = 0.064$$ Where $p$ = probability of A occurring over the range of the equation.

$$result = L + p(U-L)$$ $$result = 0 + 0.064(2-0)$$ $$result = 0.064(2)$$ $$result = 0.128$$

Where $result$ is the returned answer, in the range 0 to 2.

So the number that gets spat back out is 0.128. However, after doing 1000 iterations of it, and graphing by bins, it seems to be inverse... I thought my method above was right, but the results seem to say otherwise.

Is my maths sound enough (meaning my implementation is incorrect), or (more likely), is my maths way off the mark? Coming from a programming perspective here for reference.

1

There are 1 best solutions below

4
On

You want to generate a random variable $B$ satisfying $\Pr(0<B<t) = t^3/8$ for $0 \le t \le 2$. You are given a random variable $A$ which satisfies $\Pr(0<A<t) = t/2$ for $0\le t \le 2$.

So rewrite the equation for $B$ as $\Pr(0<B<(4t)^{1/3}) = t/2$, or $\Pr(0 < B^3/4 < t) = t/2$. So $B^3/4$ is a uniform random number in the correct range. So set $B^3/4 = A$. Therefore $B = (4A)^{1/3}$ should do what you want it to do.