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, 2018 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, 2018 at 4:27

2 Answers 2


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 and acknowledge you have read our privacy policy.

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