加权随机数?

时间:2017-08-03 02:17:24

标签: matlab

如何在SUM的5x5矩阵中随机化并生成0-50的数字,或者在右侧打印每行?

+ 有没有办法在生成数字之前给个别数字加权?

请帮忙

谢谢!

2 个答案:

答案 0 :(得分:1)

要生成0到50之间的整数随机矩阵(采样替换),您可以使用

M = randint(5,5,[0,50])

要使用每行的总和打印矩阵,请执行以下命令

[M sum(M,2)]

要使用不同的发行版,有许多技巧,但最简单的方法之一是使用统计和机器学习工具箱中的datasample函数。

% sample from a truncated Normal distribution. No need to normalize
x = 0:50;
weights = exp(-0.5*(x-25).^2 / 5^2);
M = reshape(datasample(x,25,'Weights',weights),[5,5])

修改

根据您的评论,您希望执行随机抽样无需替换。如果权重是非负整数,你可以通过模拟经典的球 - 骨实验来执行这样的随机抽样而无需替换。

首先创建一个包含每个值的适当数量的数组。

示例:如果我们的值为0,1,2,3,4且具有以下权重

  • w(0)= 2
  • w(1)= 3
  • w(2)= 5
  • w(3)= 4
  • w(4)= 1

然后我们首先创建urn数组

>> urn = [0 0 1 1 1 2 2 2 2 2 3 3 3 3 4];

然后,我们将使用randperm

来移动骨灰盒
>> urn_shuffled = urn(randperm(numel(urn)))

urn_shuffled =

     2     0     4     3     0     3     2     2     3     3     1     2     1     2     1

要选择5个元素而不进行替换,我们只需选择urn_shuffled的前5个元素。

我们可以在给定每个值的权重数组的情况下以编程方式构造它,而不是键入整个urn数组。例如

weight = [2 3 5 4 1];
urn = []
v = 0
for w = weight
    urn = [urn repmat(v,1,w)];
    v = v + 1;
end

在您的情况下,urn将包含许多元素。一旦你洗牌,你将选择前25个元素,并将它们重新整形为矩阵。

>> M = reshape(urn_shuffled(1:25),5,5)

答案 1 :(得分:0)

要绘制随机整数均匀分布的数字,您可以使用randi函数:

>> randi(50,[5,5])
ans =
34    48    13    28    13
33    18    26     7    41
 9    30    35     8    13
 6    12    45    13    47
25    38    48    43    18

打印每行的总和可以使用sum函数和2作为维度参数来完成:

>> sum(ans,2)
ans =
136
125
 95
123
172

要对各种随机数进行加权,请参阅此question