我需要生成具有以下属性的随机数。
我尝试了几种语法,但没有任何作用,例如
r=1+8.*rand(100,1);
这给了我一个介于1-9之间的随机数,但它不是一个整数(例如5.607或4.391),每次我计算它的平均值都会变化。
答案 0 :(得分:4)
您可以根据Matlab的randi
函数定义满足您要求的函数。但是要小心,很容易定义不产生随机数的随机数发生器的功能。
另一种方法可能适合 - 创建概率分布以满足您的要求。在这种情况下,您需要一个9个浮点数的向量,它总和为1,并且分别表示第i个整数出现的概率。例如,分布可能由以下向量描述:
[0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1]
将间隔[0,1]分成9个部分。然后,使用您最喜欢的rng生成[0,1]范围内的浮点数并生成一个数字,假设它是0.45。沿着0到1的间隔读取,你发现这是在第5个间隔,所以返回整数5。
显然,我一直懒得给你一个矢量,它给出6作为分布的平均值,但这对你来说不应该太难理解。
答案 1 :(得分:2)
您可以使用randi
获取随机整数
答案 2 :(得分:2)
这是一个算法,通过在当前迭代中根据平均值从一个向量的一半再生一个随机数来获得所需的平均值xmean
(具有所需的精度xeps
)。通过我的测试,它很快就达到了平均值。
n = 100;
xmean = 6;
xmin = 1;
xmax = 9;
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([xmean xmax]);
elseif xmean < mean(x)
x(find(x > xmean,1)) = randi([xmin xmean]);
end
end
x
是您需要的输出。
答案 3 :(得分:1)
您可以使用floor
将随机数截断为整数值:
r = 1 + floor(9 * rand(100,1));
获得指定的平均值有点棘手;这取决于你所追求的分配方式。
答案 4 :(得分:1)
在设计随机数生成器之前,您需要指定它应该从中绘制的分布。你只是部分完成了这个:即,你指定它从[1,9]中的整数中抽取,并且它具有你想要指定的平均值。这仍然留下了无数的分布选择。您希望您的发行版有哪些其他属性?
编辑以下注释:来自概率分布的任何有限样本的均值 - 即所谓的样本均值 - 将仅近似于分布的均值。没有办法解决这个问题。
有人说过,域[1,9]中整数的最简单(在最大熵意义上)分布是指数分布:即
p = @(n,x)(exp(-x*n)./sum(exp(-x*(1:9))));
参数x
确定分布均值。相应的累积分布是
c = cumsum(p(1:9,x));
要从分布p
中绘制,您可以从[0,1]中绘制一个随机数,并找出它所属的c
子区间:即
samp = arrayfun(@(y)find(y<c,1),rand(n,m));
将返回从[n,m]
。
p
整数数组
答案 5 :(得分:1)
如果分布并不重要且你感兴趣的只是平均值,那么就有一个特别简单的功能:
function x=myrand
x=6;
end