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

Separating and printing out the even and odd random numbers

本文关键字:打印 分离 随机数      更新时间:2023-10-16

我已经生成了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}

从列表中,偶数和奇数将是:

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

如果你仔细看的话,我把10排除在偶数做空之外。原因是,如果我在偶数列表中加10,我会得到更多的偶数而不是奇数。

使用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);
}

这将完成您在示例中解释的操作。

#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个整数的集合,一个偶数,一个奇数,而不是std::pair(,您需要一种方法来生成数字,为这些对提供存储,并跟踪生成的赔率和生成的偶数,以及关联生成的数字对的方法。

为了生成随机数,std::random_device提供了从您选择的随机数引擎(如std::mersenne_twister_engine(中生成int的随机数。您可以在std::uniform_int_distribution中生成一个数字,只需声明设备,用设备为生成器设定种子,然后在您选择的minmax之间创建一个分布即可。

要设置并生成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 << ")nn";
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个数字生成的对。请告诉我你是在问这个问题,还是在问一些稍微不同的问题。

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