在每个索引处生成具有唯一值的多个数字序列

use*_*247 5 random algorithm matlab sequence combinatorics

我有一排数字1:n.我正在寻找第二行也有数字,1:n但这些应该是随机顺序,同时满足以下要求:

  1. 两个行中没有位置具有相同的数字
  2. 没有数字组合出现两次

例如,在下面

Row 1:  1  2  3  4  5  6  7 ...
Row 2:  3  6  15 8  13 12 7 ...  
Run Code Online (Sandbox Code Playgroud)

数字7出现在第1行和第2行的相同位置(即位置7;因此不满足规则1)

而在下面

Row 1:  1  2  3  4  5  6  7 ...
Row 2:  3  7  15 8  13 12 2 ...
Run Code Online (Sandbox Code Playgroud)

2 + 7的组合出现两次(在第2和第7位;因此不满足规则2).

或许可以 - 但是不必要地耗费时间 - 手工完成(至少直到合理的数量),但在MATLAB中必须有相当优雅的解决方案.

Aar*_*aid 1

这相当简单。创建节点的随机排列,但将列表解释如下:将其解释为围绕节点的随机游走,如果节点“b”出现在节点“a”之后,则意味着节点“b”出现在节点“a”下方' 在列表中:

所以如果你的初始随机排列是

3 2 5 1 4
Run Code Online (Sandbox Code Playgroud)

那么在这种情况下,3 -> 2 -> 5 -> 1 -> 4您将按如下方式创建行:

Row 1:  1 2 3 4 5
Row 2:  4 5 2 3 1
Run Code Online (Sandbox Code Playgroud)

这种随机游走将满足这两个条件。

但是您是否希望在您的网络中允许多个周期?我知道你不希望两个人拥有彼此的帽子。但是如果有 7 个人,其中3个人拥有彼此的帽子,另外4 个人也拥有彼此的帽子,那又如何呢?这是可以接受的和/或可取的吗?