# Percentile to Z-score in PHP or JAVA

I am searching for a way to calculate the $z$-score for a given percentile $p$. I found this site doing such a calculation. They have given a formula for calculating $P(Z\leq z)$:

$$\Phi(z) = P(Z \le z) = \int_{-\infty}^z \frac{1}{\sqrt{2\pi}}e^{\frac{-u^2}{2}}du$$

Now I have the value of $P(Z\leq z)$ and I tried solving it to find out $z$, but it was really complex to solve for $z$.

Is there any function in JAVA or PHP which can do this? Or is there any mathematical way in which we can solve for $z$? (I am considering hard-coding the $z$ table as my last choice because I would have to make some approximations in that case.)

EDIT

I forgot to mention this, the main problem I am trying to solve is to draw a random point from a normal distribution. I tried using inversecdf function of Normal Distribution. Due to the generalized implementation of that function, it is taking lot of time.

Say I want to calculate the point at $0.75$ we can do that in a quick way by finding $z$-value at that point followed by a simple math $\bar{x}+\sigma\times z$. So I wanted to find some way to get $z$-score for a given percentile.

• Hi and welcome to the site! I think you want the inverse CDF or quantile function of the normal distribution. I've found this page which features the implementations in several languages (PHP and JAVA are among them). Oct 3, 2013 at 11:31
• @COOLSerdash Thank you for the reply, i forgot to mention one point. I mentioned it in the edit. Oct 3, 2013 at 11:45
• See, for example, here or here Oct 3, 2013 at 12:03

The z-table contains the area to the left of the z-number under a normal distribution with $\mu = 0$ and $\sigma = 1$. Your p-value will generally represent one minus that area (for a one tailed test). Transforming this p-value into it's corresponding z-score should not be that hard under these circumstances.

Your normal distribution with $\mu = 0$ and $\sigma = 1$ is defined by the function

$$f(z) = \frac{1}{\sqrt{2\pi}}e^{-\frac{z^2}{2}}$$

$$p = \int_z^\infty{\frac{1}{\sqrt{2\pi}}e^{-\frac{z^2}{2}}}$$

All you have to do is plug in your numbers and solve for $z$.

Note how the integral starts at $z$ and not at $-\infty$ because we're calculating $p$ which is one minus the area to the left of $z$ (This is true for one-tailed tests. For two-tailed tests divide $p$ by two before plugging it in the above formula).

Solving for $z$ yields:

$$\frac{1}{2} \text{erfc}\left(\frac{z}{\sqrt{2}}\right) = p$$

$$\text{erfc}\left(\frac{z}{\sqrt{2}}\right) = 2p$$

$$\frac{z}{\sqrt{2}} = \text{erfc}^{-1}(2p)$$

$$z = \sqrt{2} \cdot \text{erfc}^{-1}(2p)$$

Don't know much java but after reading these docs I suspect the code would be as easy as

double pToZ(double p) {
double z = Math.sqrt(2) * Erf.erfcInv(2*p);
return(z);
}


Note $\text{erfc()}$ stands for $1 - \text{erf()}$ where $\text{erf}$ is the error function.