我想得到一组唯一的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++
我想获取一组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唯一数组(即,该数量的0
s和1
s的最大可能值)。
您可以利用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
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '