C++ 二维零和一数组
我想生成一个由0和1组成的二维数组,这样它是25%的0和75%的1C++ 二维零和一数组,c++,arrays,random,C++,Arrays,Random,我想生成一个由0和1组成的二维数组,这样它是25%的0和75%的1 我知道我将使用rand()%2函数,但如何将零限制为数组的25%。如果只有0和1,一种可能的解决方案是将所有坐标保持在某种“集合”中,然后随机取出(N/M/4(N和M是数组的大小)次(获得25%的随机坐标)并标记为1,然后将其余的标记为0。您可以使用以下命令初始化数组的每个元素: int zeroOr1() { // Generates static std::default_random_engine gen;
我知道我将使用rand()%2函数,但如何将零限制为数组的25%。如果只有0和1,一种可能的解决方案是将所有坐标保持在某种“集合”中,然后随机取出(N/M/4(N和M是数组的大小)次(获得25%的随机坐标)并标记为1,然后将其余的标记为0。您可以使用以下命令初始化数组的每个元素:
int zeroOr1() { // Generates
static std::default_random_engine gen;
static std::uniform_int_distribution<int> dist(0,3);
return (dist(gen) % 4) >= 1;
}
int zeroOr1(){//
静态标准::默认随机引擎生成;
静态标准:均匀分布区(0,3);
返回(距离(根)%4)>=1;
}
由于dist(gen)%4
产生[0,1,2,3]
中的一个的可能性大致相同,(dist(gen)%4)>=1
将在大约75%的时间内评估为true
,在大约25%的时间内评估为false
注意:这并不能像其他答案一样保证一个完美的25/75分布,但它适用于所有数组大小。我需要有关应用程序的更多信息来确定这是否足够好或不合适。创建大小为
N
的向量,并使用零。
将第一个N*0.75
元素设置为一。
随机化向量
示例代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <iterator>
int main ()
{
std::srand ( unsigned ( std::time(0) ) );
const int N = 100;
const int zero_percent = 25;
const int one_percent = 100-zero_percent;
const int one_count = (N * one_percent)/100;
std::vector<int> v(N);
std::fill(v.begin(), v.begin()+one_count, 1);
std::random_shuffle (v.begin(), v.end());
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
return 0;
}
实例:您可以创建一个包含25%零和75%一的非随机数组,并将其洗牌。您可以做的是将所有设置为1,然后随机选取25%的可用索引并将其设为0。@Amgad,如果您想要一个完美的25%/75%分布或仅期望的25%/75%分布,您可以将其清除吗?没有任何保证至于生成的伪随机数的质量。特别是,不能保证均匀分布。@IInspectable,fixed,uses
std::uniform\u int\u distribution
now@WorldSEnder这是如何保证公平分配的?但这样,就不能保证有75%/25%的分配。洗牌是正确的分配方式你不能保证所有维度都有1/4:3/4的分布,这并不意味着你不应该尝试。在这方面更好(这应该是公认的答案)。对于N
<100,您正在生成100%的零。您可能打算写入const int one_count=N*one_cent/100.0+0.5;
@IInspectable您是对的,我改为除以100.0
N*one_cent/100
就足够了。不需要浮点。@Jarod42 right,我没有考虑从左到右。@Jarod42执行order@Jarod42:如果需要,浮点数学将生成更精确的结果。
1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 1