用成对不同的行和列生成随机矩阵

时间:2012-08-08 05:01:01

标签: algorithm math random

我需要随机生成1到K范围内的整数NxN矩阵,以便所有行和列分别具有元素成对不同的属性。

例如,对于N = 2且K = 3

没关系:

1 2
2 1

这不是:

1 3
1 2

(请注意,如果K

当K足够大于N时,足够有效的算法只是生成1..K整数的随机矩阵,检查每行和每列是否成对不同,如果不再尝试。

但是K不比N大很多的情况呢?

3 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,而是一个不起作用的直观解决方案的警告。 我假设通过“随机生成”你的意思是在所有现有的这样的矩阵上具有统一概率

对于N = 2且K = 3,这里是可能的矩阵,直到集合[1..K]的排列:

1 2    1 2    1 2
2 1    2 3    3 1

(因为我们忽略了集合[1..K]的排列,我们可以假设wlog第一行是1 2)。

现在,直观(但不正确)的策略是逐个绘制矩阵条目,确保每个条目与同一行或列上的其他条目不同。 要了解它为什么不正确,请考虑我们已经绘制了这个:

1 2
x .

我们正在画x。 x可以是2或3,但如果我们给出每个可能性的概率1/2,那么矩阵

1 2
3 1

将获得最终绘制的概率1/2,而它应该只有概率1/3。

答案 1 :(得分:0)

这是一个(文本)解决方案。我不认为它提供了良好的随机性,但是对于你的应用程序来说它是可以接受的。

让我们使用以下算法生成[0; K-1]范围内的矩阵(如果需要,您将对所有元素执行+1):

  • 使用您想要的任何随机方法生成第一行。
  • 每个数字都是随机序列的第一个元素,以保证在后续行中没有重复的方式计算,即对于任何不同的列x和y,你将得到x [i]!= y [i]为[0; N-1]中的所有i。
  • 计算前一行的每一行。

所有算法都基于具有我提到的属性的随机生成器。通过快速搜索,我发现Inversive congruential generator符合此要求。它似乎很容易实现。如果K是素数,它就有效;如果K不是素数,请参见同一页“复合反转发生器”。也许处理完美的正方形或立方数(你的问题听起来像数独:-))会有点棘手,但我认为通过创建具有K的素因子和不同参数化的复合生成器是可能的。对于所有生成器,每列的第一个元素是种子。

无论K的值如何,复杂性仅取决于N并且是O(N ^ 2)。

答案 2 :(得分:0)

  1. 确定性地生成具有行和列的期望属性的矩阵。提供K> N,这可以很容易地通过用i开始第i行,并用i + 1,i + 2等填充行的其余部分,在K之后回到1。其他算法是可能的。
  2. 随机置换列,然后随机置换行。
  3. 让我们假设置换行(即拾取整行并按某种顺序从它们组装新矩阵,每行可能处于不同的垂直位置)为行和列保留所需的属性,假设它们是真的之前。同样的推理也适用于列排列,以及任何一种排列的任何序列。

    1. 平凡地说,置换行不能改变在每行中没有元素出现多次的属性。
    2. 在特定列上排列行的效果是重新排序该列中的元素。这适用于任何列,并且由于重新排序元素不能生成之前没有的重复元素,因此置换行不能更改在每列中没有元素出现多次的属性。
    3. 我不确定这个算法是否能够生成所有可能令人满意的矩阵,或者如果它能够生成,它是否会以相同的概率生成所有可能令人满意的矩阵。我没有答案的另一个有趣的问题是:需要多少轮排列 - 然后 - 列 - 置换?更确切地说,是否有限的行 - 烫发 - 然后 - 列 - 烫发轮相当于有限数量的(或特别是一个)行 - 烫发 - 然后 - 列 - 烫发轮?如果是这样,则在第一行和列排列之后通过进一步的排列没有获得任何东西。也许具有较强数学背景的人可以发表评论。但无论如何它可能已经足够好了。