背景
这是一个真实的使用场景(2020.9.4)。
新生集训营中每半天都要2位学生写一篇感想。其中有5位同学在之前一天已主动报名写好了读后感。于是应该编写一个程序来为剩下的同学排序,选出幸运的同学来完成这个任务。
随机数
随机数有几种,一种是使用时间函数定出的随机数,程序示例见 【C++ 程序】 井字棋游戏(人 VS Lv1电脑)中Line 59-60。 另外,可以用直接电脑自带的随机数函数来生成随机数:
示例程序
#include <iostream>
#include <random>
using namespace std
;
int main()
{
vector
<unsigned> vec
, vint
;
unsigned alr
= 0, iter
= 0;
default_random_engine random
;
for (int i
= 0; i
!= 1000; i
++)
{
unsigned ran
= random() % 31 + 1;
vec
.push_back(ran
);
}
cout
<< "Let's choose the lucky dogs." << endl
;
for (unsigned iter
= 0; iter
!= 1000; iter
++)
{
if (vec
[iter
] != 5 && vec
[iter
] != 11 && vec
[iter
] != 12 && vec
[iter
] != 22 && vec
[iter
] != 26)
{
unsigned id
= 0;
for (unsigned i
= 0; i
!= iter
; i
++)
{
if (vec
[i
] == vec
[iter
])
id
= 1;
}
if (id
== 0)
{
vint
.push_back(vec
[iter
]);
++alr
;
}
}
if (alr
== 20) break;
}
for (unsigned j
= 0; j
!= 20; j
++)
{
if (j
% 4 == 0) cout
<< "\nSept." << j
/ 4 + 4 << ": ";
if (j
% 4 == 2) cout
<< "| ";
if (vint
[j
] < 10)cout
<< "0";
cout
<< vint
[j
] << " ";
}
cout
<< endl
;
return 0;
}
样例输出
分析
这个程序每次输出是一样的,因为这其实是个随机数表。 此处没有用uniform_int_distribution<unsigned> u(max, min),因为似乎直接用%也挺方便的。 此方法详见我的博客 【笔记】 C++中 随机数各方式总结。
另一案例
#include <iostream>
#include <vector>
#include <random>
#include <ctime>
#include <string>
using namespace std
;
vector
<unsigned> already
{ 20,22,26,27 };
int not_already(int n
)
{
unsigned cnt_n
= 0;
for (auto c
: already
)
if (c
!= n
)
++cnt_n
;
if (cnt_n
!= already
.size())
return 0;
else return 1;
}
int main()
{
vector
<unsigned> random_vec
;
srand((unsigned)time(NULL));
int ran_temp
= rand() % 10;
default_random_engine random
;
for (int i
= ran_temp
; i
!= 1000 + ran_temp
; i
++)
{
unsigned ran
= random() % 24 + 8;
random_vec
.push_back(ran
);
}
unsigned cnt
= 0;
unsigned index
= 0;
for (int i
= 0; i
!= 1000; i
++)
{
if (cnt
<= 5)
{
if (i
== 0)cout
<< "去书库数书的有:22,26,20,";
if (not_already(random_vec
[i
]))
{
cout
<< random_vec
[i
];
already
.push_back(random_vec
[i
]);
string output
= (cnt
!= 5) ? "," : "\n*如果没通知,12点05宿舍集合\n";
cout
<< output
;
++cnt
;
}
}
else if (cnt
<= 8)
{
if (cnt
== 6 && index
== 0)
{
cout
<< "\n宿舍围合接应的有:27,";
++index
;
}
if (not_already(random_vec
[i
]))
{
cout
<< random_vec
[i
];
already
.push_back(random_vec
[i
]);
string output
= (cnt
!= 8) ? "," : "\n*收到我通知到宿舍门口集合\n";
cout
<< output
;
++cnt
;
}
}
}
return 0;
}
随机数表 or not
目标,输出三个-20到60的随机数和它们的平均数。
Example 1(实际就是随机数表)
#include <iostream>
#include <cstdlib>
using namespace std
;
int main()
{
int a
= rand() % 81 - 20;
int b
= rand() % 81 - 20;
int c
= rand() % 81 - 20;
cout
<< a
<< " " << b
<< " " << c
<< endl
;
cout
<< static_cast<double>(a
+ b
+ c
) / 3 << endl
;
return 0;
}
输出示例: 每遍结果是一样的。
Example 2(不是随机数表)
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std
;
int main()
{
srand(static_cast<unsigned>(time(NULL)));
int a
= rand() % 81 - 20;
int b
= rand() % 81 - 20;
int c
= rand() % 81 - 20;
cout
<< a
<< " " << b
<< " " << c
<< endl
;
cout
<< static_cast<double>(a
+ b
+ c
) / 3 << endl
;
return 0;
}
输出示例: 改成这样就是根据时间的随机数,而每一遍时间是不一样的,因而随机数就不一样了。
ALL RIGHTS RESERVED © 2020 Teddy van Jerry 欢迎转载,转载请注明出处。
See also
Teddy van Jerry 的导航页 【C++ 程序】 井字棋游戏(人 VS 人) 【C++ 程序】 井字棋游戏(人 VS Lv1电脑) 【C++ 程序】 井字棋游戏(人 VS Lv2电脑) 【C++ 程序】 井字棋游戏(人 VS Lv3电脑) 【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版) 【C++ 程序】 五子棋游戏(人 VS 人) 【C++ 程序】 移动迷宫游戏 【C++ 程序】 贪吃蛇游戏 【C++ 程序】 数字推盘游戏(15-puzzle) 【C++ 程序】 2048游戏 【C++ 程序】 井字棋游戏(人 VS 人)(EasyX 图形界面) 【C++ 程序】 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面) 【C++ 程序】 2048游戏(EasyX 图形界面) 【C++ 程序】 贪吃蛇游戏(EasyX 图形界面)