我想得到一组唯一的n*n数组,这些数组在c++中的随机位置只包括0或1

I want to get unique set of n*n arrays which are including only 0 or 1 at random location in c++

本文关键字:数组 c++ 随机 位置 包括 想得到 一组 唯一      更新时间:2023-10-16

我想获取一组n*n个数组,包括0或1个

但是,每个元素必须彼此不同。

例如,

arr[3][3] = {{0,1,0},
             {1,0,0},
             {1,1,1}}
arr2[3][3] = {{0,1,1},
              {1,1,1},
              {0,0,1}}

和上面一样,我需要唯一的数组。

对于N个元素的数组,取一个N位数字并将其用作计数器。对于每个N位值,使用数组中每个元素中计数器的一个位创建一个数组。这将生成2N唯一数组(即,该数量的0s和1s的最大可能值)。

您可以利用next_permutation来实现这一点。下面是一个0和1的n大小数组的每一个组合:

std::vector<int> root(4, 1);
std::vector<std::vector<int>> vec(1, root);
for(auto i = root.begin(); i != root.end(); ++i)
{
    *i = 0;
    do {
        vec.push_back(root);
    } while(std::next_permutation(root.begin(), root.end()));
}

这里,n是4。但你可以做任何事。这些组合包含在vec中。

如果你的矩阵很大(n>=12),那么你可以简单地生成一个随机矩阵,并且压倒性的概率(假设你的PRNG很好),你会得到唯一的矩阵。(两个随机12x12矩阵相同的几率小于2^70中的一个,或约为10^21中的一)。

在C++11中,可以使用mt19937随机数生成器生成大量高质量的随机数:

#include <iostream>
#include <random>
main() {
    std::mt19937 generator;
    std::uniform_int_distribution<int> distribution(0,1);
    int n = 12;
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            std::cout << distribution(generator);
        }
        std::cout << std::endl;
    }
}

示例输出:

101101101001
001111110111
100110000011
111111001011
101110001000
110001000111
100110010000
101000000011
111101101101
000111011100
110111101011
100100011100