我已经生成了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,那么我的偶数将大于奇数。
答案 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::map
或std::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
。