Scilab - 查找具有不同索引的随机生成数字的平均值

Scilab - Finding the average of randomly generated numbers with different indices

假设我有一个函数可以生成介于 (1,10) 之间的随机整数。

然后,我定义一个(for 循环)有 5 次迭代。

这个(for循环)调用上面定义的函数,然后检查函数生成的整数的值。根据整数的值,决定变量"cost"。

function integer = UniformInt(a, b)
    integer =  min( floor( rand()*(b-a) ) + a , b);
endfunction

for i=1:5

    x(i) = UniformInt(1,10);

    if (x(i)<4) then
        cost(i) = 15;

        elseif (4<=x(i) && x(i)<=8) then
        cost(i) = 27;

        else
        cost(i) = 35;

    end

end

现在,当我 运行 并找到 x 时,假设生成的值是:

   5.
   9.
   5.
   2.
   2.

因此,不同的 cost 值将是:

   27.
   35.
   27.
   15.
   15.

到目前为止一切都很好。现在,我想对这些结果做的是:

检查x的每个值出现了多少次。我可以通过 Scilab 的 tabul 函数来做到这一点:

9.   1.
5.   2.
2.   2.

现在,我真正想要编码的是:

x=9只出现了一次,所以,cost的平均值是35/1 = 35.

x=5出现了两次,所以cost的平均值是(27+27)/2 = 27.

x=2出现了两次,所以cost的平均值是(15+15)/2 = 15.

我该怎么做?

为了后代,用户@Stéphane Mottelet 提供的答案在其中很有用(因为我上面的代码很简单)的代码如下:

function integer = UniformInt(a, b)
    integer =  min( floor( rand()*(b-a) ) + a , b);
endfunction

for i=1:5

    x(i) = UniformInt(1,10);

    if (x(i)<4) then
        cost(i) = 15*rand();

        elseif (4<=x(i) && x(i)<=8) then
        cost(i) = 27*rand();

        else
        cost(i) = 35*rand();

    end

end

现在成本值乘以一个随机数,所以, 如果说 x=10 的值出现了 2 次,那么 x=10 时的平均成本就不会简单地是 (35+35)/2.

我会这样做,但答案很简单,因为现在成本值对于给定的 x 值是相同的(我想你的实际应用程序会抽取随机的成本值)

t = tabul(x);
for k = 1:size(t,1)
  avg(k) = mean(cost(x == t(k)));
end