I can find the

random('normal', 0, 1, 10000,1)

command in MATLAB but it generates half-normal variates. I would like to generate random half-normal variates. The half-normal distribution is defined by


Can I generate a random half-normal variates from random normal variates?

  • $\begingroup$ Recommend adding "Truncate" or "Truncation" tag. $\endgroup$ Sep 26 '18 at 4:23
  • $\begingroup$ @SecretAgentMan I don't think those tags (neither truncation nor normal-distribution) would increase the content visibility and improve the question on CompSci SE. $\endgroup$
    – Anton Menshov
    Sep 26 '18 at 4:27

As Wikipedia says, you can just compute a normally distributed random variable with a mean of zero and take the absolute value. The half-normal probability distribution function is identical to the normal PDF with $\mu = 0$ for $X > 0$, except for a factor of two for the normalization.


If $X\sim \text{Normal}(\mu,\sigma)$, then the $Y\sim \text{Half-Normal}$ is obtainable via several approaches.

  1. Absolute Value: $\quad Y = |X|\quad $ (As pointed out by @DavidZ.)
  2. Truncation: $\quad Y = X_{(0,\infty)} \quad $ MATLAB does this nicely with truncate().
  3. Conditioning (Logical Indexing): $\quad Y = (X|X>0)\quad $

Graphical examples below with code. Truncation

% MATLAB R2018b
mu = 0; sigma = 1;
pdN = makedist('Normal',mu,sigma);
pdHN = truncate(pdN,0,inf);

X = (-4:.01:4)';
Xt = X(X>0);

figure, hold on, box on
p(1) = plot(X,pdf(pdN,X),'k-','DisplayName','Normal')
p(2) = plot(Xt,pdf(pdHN,Xt),'b-','DisplayName','HalfNormal')
YAxis = get(gca,'YTick');
ylabel('Probability Density Function (PDF)')

Logical Indexing

Y = random(pdN,50000,1);
Yt = Y(Y>0);

figure, hold on, box on

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.