数组操作 - 随机选择元素

3
假设我有一个长度为N的数组。我想随机选择n个位置,将它们置为零,然后将现存的元素加到下一个非零元素上。
例如,假设r=(r1,r2,r3,r4,r5)N=5。让n=2,并随机选择第三个和第四个位置。那么我想要将r转换为r_new=(r1,r2,0,0,r3+r4+r5)
相反,如果随机选中的位置是13,那么我希望得到r_new=(0,r1+r2,0,r3+r4,r5)
我在MATLAB中编写代码。这是我目前的代码。
u   = randperm(T);
ind = sort(u(1:n(i)));
tmp = r(ind);
r(ind) = 0;

x = find( r );

我不一定需要MATLAB代码,伪代码也足够有帮助。

2个回答

1
假设 N、n 和 r 已经生成,然后我们选择随机索引:
inds = randi(N,n,1);

然后,为了达到预期的结果,您可以按照以下方式进行循环:
inds = sort(inds);

for ii=1:numel(inds)
    if(inds(ii)<N)
        r(inds(ii)+1)=r(inds(ii)+1) +r(inds(ii));
        r(inds)=0;
    else
        r(inds)=0;
    end
end

这将创建所需的结果,将值添加到未被选定设置为0的下一个索引中。
请注意,我必须假设一种边缘情况,即如果最后一个索引设置为0,则其值不会添加到任何内容中。

如果 randi 多次返回相同的整数会发生什么? - sco1
结果与仅使用所选索引的唯一子集的情况相同。问题的主要焦点似乎是关于向量所需更改的内容,而不是生成唯一值,因为问题实际上并没有说明随机索引必须是唯一的。 - Tar

1
我假设最后一个位置永远不能被选中,否则预期的行为是未定义的。因此,您需要从1N-1(而不是N)随机选择n个均匀分布的位置。
下面是一种方法:
  1. 1N-1中选择n个不同的随机位置,并对它们进行排序。将结果位置向量称为pos。可以使用randpermsort轻松完成此操作。
  2. 对于pos中的每个值,例如p,将r(p)累加到r(p+1)中,并将r(p)设置为零。这可以通过for循环完成。
在第2步中,如果位置p+1也恰好属于pos,则累积值将在随后的迭代中向右移动。这是因为pos已经排序,所以随机选择的位置从左到右进行处理。
r = [3 5 4 3 7 2 8]; %// data
n = 2; %// number of positions
pos = sort(randperm(numel(r)-1,n)); %// randomly select positions, and sort them
for p = pos
    r([p p+1]) = [0 r(p)+r(p+1)]; %// process position p
end

1
randsample 需要统计工具箱。对于普通的 MATLAB 抽样,您可以使用类似于 idx = zeros(n, 1); while length(unique(idx)) < n; idx = sort(randi(numel(r)-1, [1 n])); end 这样的代码来确保获得唯一的整数值。 - sco1
@excaza ... 或者你可以使用 randpermpos = randperm(numel(r)-1,n)。好主意,谢谢!我会更改以避免使用统计工具箱。 - Luis Mendo
哎呀,咦,那是一个更干净的选项。 - sco1
我遇到了 ??? Error using ==> horzcat CAT arguments dimensions are not consistent. 错误。 - deb
@deb 具体是哪些数据? - Luis Mendo
@LuisMendo 不用在意。我猜是因为我使用的是Matlab 2011的缘故。 - deb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接