我想生成一个零和一的二维数组,使其为25%零和75%零。
我知道我将使用rand()%2函数但是如何将零限制为只有25%的数组呢?
答案 0 :(得分:2)
使用零创建大小为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;
}
<强>输出强>
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
答案 1 :(得分:0)
如果只有0和1,一个可能的解决方案是将所有坐标保持在某种类型的&#34; set&#34;然后随机取出(N / M / 4(n和m是数组的大小)次(得到25%的随机坐标))并标记为1,然后将其余标记为0.
答案 2 :(得分:0)
您可以使用以下内容初始化数组的每个元素:
int zeroOr1() { // Generates
static std::default_random_engine gen;
static std::uniform_int_distribution<int> dist(0,3);
return (dist(gen) % 4) >= 1;
}
由于dist(gen) % 4
产生[0, 1, 2, 3]
之一的可能性相同,(dist(gen) % 4) >= 1
将在约75%的时间内评估为true
,false
约为25%的{{1}}时间。
注意:这并不像其他答案一样保证完美的25/75分布,但它适用于所有阵列大小。我需要有关申请的更多信息,以确定这是否足够好或不合适。