我需要随机生成1到K范围内的整数NxN矩阵,以便所有行和列分别具有元素成对不同的属性。
例如,对于N = 2且K = 3
没关系:
1 2
2 1
这不是:
1 3
1 2
(请注意,如果K 当K足够大于N时,足够有效的算法只是生成1..K整数的随机矩阵,检查每行和每列是否成对不同,如果不再尝试。 但是K不比N大很多的情况呢?
答案 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):
所有算法都基于具有我提到的属性的随机生成器。通过快速搜索,我发现Inversive congruential generator符合此要求。它似乎很容易实现。如果K是素数,它就有效;如果K不是素数,请参见同一页“复合反转发生器”。也许处理完美的正方形或立方数(你的问题听起来像数独:-))会有点棘手,但我认为通过创建具有K的素因子和不同参数化的复合生成器是可能的。对于所有生成器,每列的第一个元素是种子。
无论K的值如何,复杂性仅取决于N并且是O(N ^ 2)。
答案 2 :(得分:0)
让我们假设置换行(即拾取整行并按某种顺序从它们组装新矩阵,每行可能处于不同的垂直位置)为行和列保留所需的属性,假设它们是真的之前。同样的推理也适用于列排列,以及任何一种排列的任何序列。
我不确定这个算法是否能够生成所有可能令人满意的矩阵,或者如果它能够生成,它是否会以相同的概率生成所有可能令人满意的矩阵。我没有答案的另一个有趣的问题是:需要多少轮排列 - 然后 - 列 - 置换?更确切地说,是否有限的行 - 烫发 - 然后 - 列 - 烫发轮相当于有限数量的(或特别是一个)行 - 烫发 - 然后 - 列 - 烫发轮?如果是这样,则在第一行和列排列之后通过进一步的排列没有获得任何东西。也许具有较强数学背景的人可以发表评论。但无论如何它可能已经足够好了。