2012-03-21 851 views
4

我需要生成具有以下属性的随机数。在Matlab中用最大,最小和平均值(平均值)生成一个随机数

  • min必须1
  • MAX必须9
  • 平均(平均)为6.00(或别的东西)
  • 随机数必须是整数(正)只

我已尝试过几种语法,但没有任何效果,例如

r=1+8.*rand(100,1); 

这给我一个介于1-9之间的随机数,但它不是一个整数(例如5.607或4.391),每次我计算它的平均值就会变化。

+3

你想为你的分布是什么形状? – Jonas 2012-03-21 15:48:04

+0

对于任何RNG,不要指望平均值将始终与您指定的完全相同,它会因运行而异。更大的N可以更接近。 – yuk 2012-03-21 17:44:33

+0

分布的类型并不重要,只要每个随机数的集合都是相同的。 – Chanon 2012-03-22 02:02:58

回答

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是您需要的输出。

+0

这个语法给我--- ???未定义的函数或方法'randi'用于'double'类型的输入参数.---- T-T帮我解答。 – Chanon 2012-03-22 02:09:50

+0

函数'randi'(产生随机整数)在MATLAB版本2008b中首次出现。可能你的年龄更大。看到这[SO回答](http://stackoverflow.com/questions/6415424/using-rand-in-matlab-to-produce-numbers-between-limits/6415698#6415698)。 – yuk 2012-03-22 03:10:09

+0

好吧,现在我明白了,因为我正在运行MATLAB 2008a TT – Chanon 2012-03-22 04:59:01

1

你可以使用floor截断你的随机数只整数值:

r = 1 + floor(9 * rand(100,1)); 

获得规定的平均有点麻烦;这取决于你之后的发行方式。

+0

任何一种分配都可以,每一个产生的意思都是一样的。 – Chanon 2012-03-22 02:21:53

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作为平均值的向量的分布,但这对你来说不应该太难。

2

您可以使用randi获得随机整数

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中抽取的整数数组。

+0

询问任何类型的分布是可以的,分布的类型并不重要,只是想要每个随机数的意思是相同的。谢谢。 – Chanon 2012-03-22 02:04:49

1

如果分布并不重要,所有你感兴趣的是平均值,然后有一个特别简单的函数,它是:

function x=myrand 
x=6; 
end 
相关问题