分离并打印出偶数和奇数随机数

时间:2019-11-13 06:20:40

标签: c++ random

我已经生成了100个随机数,其中我必须将随机数的偶数和奇数都做短。所有偶数或奇数都不能重复。

例如,我将创建100个随机数

#include <iostream>   
#include <cstdlib>    

int main()
{
  for (int i=1; i <=100; ++i){

      //double p = rand();
      std::cout <<"random number is :" << rand()<<std::endl;


  }


}

由于我不知道100个随机数中的偶数和奇数是否相同,因此我想选择最小的偶数和奇数对。我也想知道分别生成的总奇数和偶数。需要注意的是,例如,如果多次打印出任何偶数或奇数,我想将其视为一个。

例如。假设打印出的随机数有60个偶数和40个奇数。而且从60个偶数中也有10个偶数是重复的。因此,我认为不同的事件编号是50。打印出的编号将是前20个偶数和前20个奇数。

之所以要这样做,是因为我想学习如何从随机生成器的for循环中滤除偶数和奇数。

更新:

我的目标是从生成的随机数中找到偶数和奇数。当我短缺偶数和奇数时,所有的偶数和奇数都将不同。这意味着,如果我发现偶数2被打印了5次,我仍然会考虑那个。这样,我想找到偶数和奇数的最小数量。

举个例子:

生成的打印输出为:{1,2,2,3,4,5,6,8,9,3,2,4,6,10}

从列表中,偶数和奇数分别为:

even = {2,4,6,8} 奇数= {1,3,5,9}

如果仔细看,我从空头中排除了10个。原因是,如果我在偶数列表中加10,那么我的偶数将大于奇数。

3 个答案:

答案 0 :(得分:2)

使用std::unorderd_set创建奇数集和偶数集

检查数字是否为奇数=(num&1)对于奇数将为1,对于偶数将为0

std::unordered_set<int> set_odd;
std::unordered_set<int> set_even;
for (int num : nums) {
  if (num & 1) set_odd.insert(num);
  else set_even.insert(even);
}

答案 1 :(得分:1)

这将按照您在示例中的说明进行。

#include <set>
#include <vector>

int main()
{
  std::vector<int> numbers = {1, 2, 2, 3, 4, 5, 6, 8, 9, 3, 2, 4, 6, 10};
  std::set<int> even, odd;

  // sort the numbers into even and odd sets
  for (auto const& n : numbers)
  {
    if (n % 2 == 0)
      even.insert(n);
    else
      odd.insert(n);
  }

  // figure out which set is smaller
  int min = std::min(even.size(), odd.size());

  // print out the evens
  std::cout << "even = ";
  auto it = even.begin();
  for(int i = 0; i < min; ++i)
  {
    std::cout << *(it++) << " ";
  }
  std::cout << std::endl;

  // print out the odds
  std::cout << "odd  = ";
  it = odd.begin();
  for(int i = 0; i < min; ++i)
  {
    std::cout << *(it++) << " ";
  }
  std::cout << std::endl;
}

答案 2 :(得分:0)

如果您仅需要个随机数(如2个整数的集合中的对,一个偶数,一个奇数而不是std::pair),则需要一种生成数字的方法,为这些对提供存储,并跟踪生成的几率和偶数的数量,以及一种将生成的数字对关联的方法。

要生成随机数,std::random_device可以根据您选择的随机数引擎(例如std::mersenne_twister_engine)为int生成随机数。您只需声明设备,将生成器植入设备,然后在您的 min max 之间创建分布,即可在std::uniform_int_distribution中生成数字选择。

要设置并生成int的正数范围内的随机数,您可以执行以下操作:

...
#include <random>

#define NMAX std::numeric_limits<int>::max()
...
    std::random_device rd;    /* delcare the randon number generator device */
    std::mt19937 gen(rd());   /* standard mrsene_twister engine seeded w/rd */
    std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */

要从分布中请求一个电话号码,只需:

        int r = dist(rd);                       /* generate rand */

如何存储生成的对,取决于您如何协调将生成的偶数和奇数相加以协调将数字对存储在一起的方式。您可以使用std::mapstd::unordered_map,也可以简单地使用偶数和奇数的std::vector<int>。使用后者,您可以填充一个偶数向量和一个奇数向量,然后简单地输出两者中较小的.size(),以捕获从我们的100个随机整数中生成的偶数对。

例如:

#define MAXRAND 100
...
    std::vector<int> even, odd;
    ...
    for (int i = 0; i < MAXRAND; i++) {         /* loop MAXRAND times */
        int r = dist(rd);                       /* generate rand */
        if (r % 2 == 0)                         /* if even */
            even.push_back(r);                  /* add to even vector */
        else    /* odd number */
            odd.push_back(r);                   /* add to odd vector */
    }

通过这种方式,您可以指定生成100个随机数,最终却从这100个随机数中生成了许多偶数对-听起来像是您要的。

完全将其放入您可以做的事情:

#include <iostream>
#include <iomanip>
#include <random>
#include <vector>

#define NMAX std::numeric_limits<int>::max()
#define MAXRAND 100

int main (void) {

    std::vector<int> even, odd;
    std::random_device rd;    /* delcare the randon number generator device */
    std::mt19937 gen(rd());   /* standard mrsene_twister engine seeded w/rd */
    std::uniform_int_distribution<int> dist(0, NMAX); /* create disribution */
    size_t limit = 0;

    for (int i = 0; i < MAXRAND; i++) {         /* loop MAXRAND times */
        int r = dist(rd);                       /* generate rand */
        if (r % 2 == 0)                         /* if even */
            even.push_back(r);                  /* add to even vector */
        else    /* odd number */
            odd.push_back(r);                   /* add to odd vector */
    }
    /* output results */
    limit = (even.size() > odd.size()) ? odd.size() : even.size();
    std::cout << limit << " even-odd pairs (0 - " << NMAX << ")\n\n";
    for (size_t p = 0; p < limit; p++)
        std::cout << std::setw(12) << even.at(p) << 
                    "  " << odd.at(p) << '\n';
}

使用/输出示例

运行时,通常会生成40至50对数字-随机分布相当好,例如。

$ ./bin/evenoddpairs
48 even-odd pairs (0 - 2147483647)

  1513290664  712950177
  2014370968  990873219
   161619218  6719997
  2062410942  1965300831
  2072442520  938385103
   669324326  1957687455
  1201350414  2134189381
   217290372  1304388089
   726760634  232069103
  2086887656  1784024967
  1345123406  185879429
  1706842790  686104759
  1034648158  268926351
  1445724500  1996600823
  1303450734  1890287253
   763120758  1581912187
  1788401668  1537971261
  1542967608  1842999149
   377964104  1995119937
    87264498  644262155
   224210492  519040373
   692262016  372293591
   502458404  1867793795
   575578512  751306553
   373162704  170423471
  1502626218  152785903
   284546326  287967359
   388031960  1233214425
  1839930048  243652639
   465469190  1747259241
  1488469408  252779515
  2144753340  1992139979
  2010564888  298805387
   917820234  187798339
  1204892922  1454685783
   563347322  50283749
  1303887182  345841727
  1429521892  1668482773
   702286146  1191166889
  1490493310  963750729
   986716484  1522036479
  1107465502  1445768043
  1613852374  1307939505
  1584334086  1565159437
  1325156802  354726127
  1165679412  1618569419
  1192475084  1341169211
    71913214  1569003463

有很多方法可以将它们组合在一起,但是由于要限制生成100个随机数,然后仅收集从这100个数字中创建的偶数对,因此,确保偶数/奇数向量很简单并仅产生100对中的对。让我知道您是在问这个问题还是在问一些稍微不同的问题。

如果您只需要强制执行 unique 随机数,则可以从两个向量中填充std::unordered_map