当前位置: 首页 > 知识库问答 >
问题:

洗牌矢量元素,使得两个相似的元素最多聚在一起两次

养慈
2023-03-14

为了举个例子:

我有一个名为vec的向量,包含10个1和10个2。我试图随机安排,但有一个条件,两个相同的值不能在一起超过两次。

到目前为止,我所做的是使用randperm函数生成vec的随机索引,并相应地洗牌vec。这就是我所拥有的:

vec = [1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2];
atmost = 2;
indexes = randperm(length(vec));
vec = vec(indexes);

>> vec =
      2  1  1  1  2  1  2  1  2  1  1  1  2  2  1  2  1  2  2  2

我的代码随机排列vec元素,但不满足两个相似值最多出现两次的条件。我该怎么做?有什么想法吗?

共有2个答案

赵飞语
2023-03-14

这将生成相当随机的非连续向量。我不确定它是否涵盖了所有的可能性。

out=[];
for i=1:10
    if randi(2)==1
        out=[out,1,2];
    else
        out=[out,2,1];
    end
end
disp(out)

示例结果

1,2,1,2,1,2,1,2,2,1,2,1,1,2,2,1,2,1,1,2,
2,1,2,1,1,2,2,1,2,1,1,2,2,1,2,1,1,2,1,2,
1,2,2,1,2,1,1,2,1,2,2,1,2,1,2,1,2,1,2,1,
2,1,2,1,2,1,1,2,1,2,2,1,1,2,2,1,2,1,1,2,
2,1,1,2,1,2,1,2,2,1,2,1,1,2,1,2,1,2,1,2,
2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,2,2,1,
1,2,2,1,1,2,1,2,2,1,2,1,2,1,1,2,2,1,1,2,
2,1,1,2,2,1,2,1,1,2,2,1,1,2,1,2,1,2,1,2,
1,2,2,1,1,2,1,2,2,1,2,1,1,2,1,2,1,2,1,2,
1,2,1,2,2,1,2,1,2,1,2,1,1,2,1,2,2,1,2,1,
锺离飞鸣
2023-03-14

可以先确定一个值的梯段长度,然后拟合其周围的其他值。

在解释中,我将在向量中使用ab的值,以免混淆向量(1和2)元素的值和每个元素(1和2)的运行长度。

最终目标是使用repelem来构造无序向量repelem获取要重复的元素向量,以及每个元素重复多少次的向量。例如,如果我们有:

v = [b   a   b   a   b   a   b   a   b   a   b   a   b   a   b   a   b]
n = [1   1   1   2   1   1   2   1   2   1   1   1   1   2   1   1   0]

repelem将返回:

shuffled_vec = [b  a  b  a  a  b  a  b  b  a  b  b  a  b  a  b  a  a  b  a]

作为第一步,我将为对应于a值的计数生成随机值。在这个例子中,这将是:

a_grouping = [1   2   1   1   1   1   2   1]

首先,在分组向量中随机选择2的数量。最多可以有n/2。然后加上1来组成所需的总数。

num_total = 10;   % number of a's (and b's)
% There can be 0..num_total/2 groups of two a's in the string.
two_count = randi(num_total/2 + 1) - 1;
% The remainder of the groups of a's have length one.
one_count = num_total - (2*two_count);
% Generate random permutation of two_count 2's and one_count 1's
a_grouping = [repmat(2, 1, two_count), repmat(1, 1, one_count)];

这将给我们提供如下信息:

a_grouping = [2   2   1   1   1   1   1   1]

现在洗牌:

a_grouping = a_grouping(randperm(numel(a_grouping)));

结果是:

a_grouping = [1   2   1   1   1   1   2   1]

现在我们需要弄清楚b值的去向。每次运行a值之间必须至少有一个b(最多两个),并且在字符串的开头和结尾可能有0、1或2个b值。因此,我们需要为下面的xy值生成计数:

all_grouping = [y  1  x  2  x  1  x  1  x  1  x  1  x  2  x  1  y]

x值必须至少为1,因此我们将首先分配它们。因为y值可以是0、1或2,所以我们将它们设置为0。

% Between each grouping of a's, there must be at least one b.
% There can be 0, 1, or 2 b's before and after the a's,
% so make room for them as well.
b_grouping = zeros(1, numel(a_grouping) - 1 + 2);
b_grouping(2:end-1) = 1;   % insert one b between each a group

对于我们需要分配的每个剩余计数,只需选择一个随机的插槽。如果它还没有被填满(即如果它是

% Assign location of remaining 2's 
for s = numel(a_grouping):num_total
   unassigned = true;
   while unassigned
      % generate random indices until we find one that's open 
      idx = randi(numel(b_grouping));
      if b_grouping(idx) < 2
         b_grouping(idx) = b_grouping(idx) + 1;
         unassigned = false;
      end
   end
end

现在我们有了ab的单独计数:

a_grouping = [1   2   1   1   1   1   2   1]
b_grouping = [1   1   1   2   2   1   1   1   0]

我们将构建值向量(v,从示例开始)并交错分组(n向量)。

% Interleave the  a and b values
group_values = zeros(1, numel(a_grouping) + numel(b_grouping));
group_values(1:2:end) = 2;
group_values(2:2:end) = 1;
% Interleave the corresponding groupings
all_grouping = zeros(size(group_values));
all_grouping(2:2:end) = a_grouping;
all_grouping(1:2:end) = b_grouping;

最后,repelem将所有内容放在一起:

shuffled_vec = repelem(group_values, all_grouping)

最终结果是:

shuffled_vec =
   1   2   2   1   1   2   1   1   2   2   1   1   2   2   1   1   2   2   1   2

完整代码:

num_total = 10;   % number of a's (and b's)
% There can be 0..num_total/2 groups of two a's in the string.
two_count = randi(num_total/2 + 1) - 1;
% The remainder of the groups of a's have length one.
one_count = num_total - (2*two_count);
% Generate random permutation of two_count 2's and one_count 1's
a_grouping = [repmat(2, 1, two_count), repmat(1, 1, one_count)];
a_grouping = a_grouping(randperm(numel(a_grouping)));
% disp(a_grouping)

% Between each grouping of a's, there must be at least one b.
% There can be 0, 1, or 2 b's before and after the a's,
% so make room for them as well.
b_grouping = zeros(1, numel(a_grouping) - 1 + 2);
b_grouping(2:end-1) = 1;   % insert one b between each a group
% Assign location of remaining 2's 
for s = numel(a_grouping):num_total
   unassigned = true;
   while unassigned
      % generate random indices until we find one that's open 
      idx = randi(numel(b_grouping));
      if b_grouping(idx) < 2
         b_grouping(idx) = b_grouping(idx) + 1;
         unassigned = false;
      end
   end
end

% Interleave the  a and b values
group_values = zeros(1, numel(a_grouping) + numel(b_grouping));
group_values(1:2:end) = 2;
group_values(2:2:end) = 1;
% Interleave the corresponding groupings
all_grouping = zeros(size(group_values));
all_grouping(2:2:end) = a_grouping;
all_grouping(1:2:end) = b_grouping;

shuffled_vec = repelem(group_values, all_grouping)
 类似资料:
  • 本文向大家介绍一个数组,除一个元素外其它都是两两相等,求那个元素?相关面试题,主要包含被问及一个数组,除一个元素外其它都是两两相等,求那个元素?时的应答技巧和注意事项,需要的朋友参考一下 考察点:数组    

  • 问题内容: 我在这里做错了什么? 我有一个 ,但在第一个上我想在顶部填充零,在第二个上我想没有底部边框。 我尝试为此首先和最后创建类,但我认为在某处错了: 和HTML 我猜不可能有两个不同的课程吗?如果可以,我该怎么做? 问题答案: 如果要在一个元素上使用两个类,请按以下方式进行操作: 像这样在css中引用它:

  • 我有一个按钮和一个文本区: null null 现在我想让它们像这样向右或向左对齐: 运行代码段按钮和文本区如何向左对齐?

  • 我在Wordpress和Visual Composer一起工作,我有一个切换容器。基本上,我点击每个选项卡,下面的内容就会发生变化。我想通过CSS为每个选项卡分配一个不同的图像作为背景。但是,我已经实现了这一点,因为每个选项卡都有相同的类名(由visual composer赋予它),所以图像是相同的。我需要弄清楚如何给每个选项卡一个唯一的id,这样我就可以给每个选项卡一个自己的背景图像--但是由于

  • 给定任何自然数数组,例如:[2,1,2,3]查找数组是否可以转换为Max数组(打印-“是”)或如果不能(打印-“否”) 使其成为最大数组 - 将数组的每个元素转换为等于其最大元素。在上面的例子中,它将是[3,3,3,3],但是通过遵循这些规则 - 一次将任何两个元素增加1(正好是2个元素。不能一次增加一个或多个元素) 多次执行此操作,直到将每个元素转换为最大元素(如果可能,请打印“YES”,否则打

  • 现在我希望从基于id的XPath生成唯一的基于类的XPath。Firepath生成的类XPath可能指向多个元素,而不是唯一的。但是firepath生成的id XPath总是唯一的,即指向单个元素。 所以,我正在尽可能地生成两个之间的映射。但我需要测试以下内容: 以确保我创建的类xpath对应于所需的DOM元素。任何帮助都将得到高度赞赏。我希望生成的xpath示例是: 目标是减少xpath的深度,