将偶数和奇数随机数分离并打印出来
Separating and printing out the even and odd random numbers
我已经生成了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中生成一个数字,只需声明设备,用设备为生成器设定种子,然后在您选择的min和max之间创建一个分布即可。
要设置并生成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 << ")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
。
- 如何循环打印顶点结构
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 如何在c++中打印目录
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 在线编译器中的分段C++没有打印消息
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 如何将结构插入到集合中并打印集合的成员
- 在循环C++中指定字符串之后,不会打印该字符串
- 以螺旋方式打印矩阵的程序.(工作不好)
- 从控制台中删除最后打印的元素
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何仅使用对象名称打印特定于对象的成员
- 回溯C++不打印函数,因此文件
- 在一定长度后从数组中打印时缺少整数
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 在gem5中打印文件中的所有cache_blocks
- 打印数字图案
- Log4cpp:以UTC/GMT时区打印日期
- 将偶数和奇数随机数分离并打印出来