HP Forums
Which formula does randNorm use? - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: HP Prime (/forum-5.html)
+--- Thread: Which formula does randNorm use? (/thread-9403.html)



Which formula does randNorm use? - Joe Horn - 10-30-2017 08:38 PM

According to Wikipedia, the "Box-Muller method" for generating random values which are "normally" distributed (that is, fitting the "normal" curve, AKA the bell curve) is this: generate two uniformly random numbers between 0 and 1 (e.g. two outputs from Prime's RANDOM function), call them \(U\) and \(V\), then plug them into this formula:

\({\sqrt {-2\ln U}}\cdot\cos(2\pi V)\)

This returns random numbers which are normally distributed around 0 with a standard deviation of 1. Plot a bunch of them and you'll see a nice bell curve.

Of course, if you need normally distributed random numbers centered around a mean of \(M\) with a standard deviation of \(S\), you take the above result and simply stretch it by a factor of \(S\), then shift it up by \(M\), like this:

\(M+S\cdot{\sqrt {-2\ln U}}\cdot\cos(2\pi V)\)

However, I'm puzzled why the "Box-Muller method" uses \(2\pi\) instead of just \(\pi\). Since the range of \(\cos(2\pi V)\) is the same as the range of \(\cos(\pi V)\), it seems to me that multiplying by 2 here is mathematically redundant.

The reason I'm even bringing this up is that all the programs (for older HP calculator models) which input \(M\) and \(S\) and return \(randNorm(M,S)\) do NOT multiply by 2. They simply use this formula (notice it's just \(\pi\), not \(2\pi\)):

\(M+S\cdot{\sqrt {-2\ln U}}\cdot\cos(\pi V)\)

Which leads to these questions:

1. Am I right that multiplying by 2 is unnecessary and may be omitted?
   1a. If Yes, then why does everybody say that the Box-Muller method needs \(2\pi\)?
2. What formula does the randNorm function in the HP Prime use?
   2a. If it uses Box-Muller with \(2\pi\), why is the 2 in there?


RE: Which formula does randNorm use? - parisse - 10-30-2017 09:11 PM

The CAS code for randNorm is
Code:

    double u=giac_rand(contextptr)/(rand_max2+1.0);
    double d=giac_rand(contextptr)/(rand_max2+1.0);
    return std::sqrt(-2*std::log(u))*std::cos(2*M_PI*d);
Frankly speaking I used the formula without taking care of why it works, it's not really CAS...


RE: Which formula does randNorm use? - Joe Horn - 10-30-2017 11:10 PM

Thanks for answering questions 2 and 2a, Bernard! If any of y'all can answer questions 1 and 1a, I'd be most grateful.