Generate random numbers with conditions (min, max, mean, and specific values)

25 次查看(过去 30 天)
Hi! I'm very new at Matlab and I would like some tips to solve the following issue ...
I would like to generate a sequence of 40 random numbers (floats) (min=8, max=20, mean=10). However, 4 of these numbers must be equal to 16. How do you solve this question?
  6 个评论
the cyclist
the cyclist 2022-11-21
I will also try to be clearer. You cannot have both of these things:
  • numbers between 8 and 20
  • numbers from a normal distribution
These are mathematically contradictory facts. It is like saying you want a number that is both bigger than 3, and smaller than 2. It just cannot be.
You need to figure out how to reconcile these facts. Often, people don't really understand what a normal distribution is, and they might be OK with some other random distribution. Or sometimes they are OK with a truncated normal. But, we cannot figure that out for you.

请先登录,再进行评论。

回答(2 个)

Dev
Dev 2022-11-28
You might be aware that at least 4 numbers are going to be 16, so you have to generate 36 random numbers with mean 28/3. If type of distribution doesn’t matter, You can use the following code to generate such distribution.
n = 36;
xmean = 28/3;
xmin = 8;
xmax = 20;
xeps = 0.01;
x = randi([xmin xmax],n,1);
while abs(xmean - mean(x)) >= xeps
if xmean > mean(x)
x(find(x < xmean,1)) = randi([ceil(xmean) xmax]);
elseif xmean < mean(x)
x(find(x > xmean,1)) = randi([xmin floor(xmean)]);
end
end

Bruno Luong
Bruno Luong 2022-11-28
Use this fex
https://fr.mathworks.com/matlabcentral/fileexchange/9700-random-vectors-with-fixed-sum
r = randperm([16+zeros(4,1); randfixedsum(36,1,40*10-16*4,8,20)]);
p=randperm(40);
r=r(p)
Most of numbers are around 10 since the MEAN pull the numbers arouns that value, so the chance to get big number (20) is tiny.

类别

Help CenterFile Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by