Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二维零和一数组_C++_Arrays_Random - Fatal编程技术网

C++ 二维零和一数组

C++ 二维零和一数组,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;

我想生成一个由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;
    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