rand() 函数
能够生成随机数在很多情况下都很有用,包括创建游戏,统计建模程序和类似的最终产品。
在C++ 标准库中,可以访问被称为rand()的伪随机数生成器函数。在使用时,我们需要包含头文件<cstdlib>。
下面是一个示例:
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
cout << rand();
}
这将输出一个随机数。
for 循环生成随机数
在 C++ 中,for 循环可以用来生成多个随机数。
int main() {
for (int x = 1; x <= 5; x++) {
cout << rand() << endl;
}
}
/* 输出:
41
18467
6334
26500
19169
*/
模(%) 运算符生成随机数
在 C++ 中,可以使用模(%) 运算符来生成特定范围内的随机数。
下面是一个例子,生成1到5范围内的整数。
int main () {
for (int x = 1; x <= 10; x++) {
cout << 1 + (rand() % 5) << endl;
}
}
/* 输出:
2
3
5
1
5
5
4
4
3
5
*/
但是,rand() 函数只会返回一个伪随机数。这意味着每次运行代码时,都会生成相同的编号。
srand() 函数
在 C++ 中,srand() 函数用于生成真正的随机数(随机种子)。
srand() 函数允许指定一个种子(seed) 值作为其参数,用于rand() 函数的算法。
下面是一个例子:
int main () {
srand(30);
for (int x = 1; x <= 10; x++) {
cout << 1 + (rand() % 5) << endl;
}
}
更改种子(seed) 值会改变rand() 的返回值。但是,相同的参数将导致相同的输出。
生成真正的随机数
在 C++ 中,生成真正随机数的方法是使用当前时间作为srand() 函数的种子值。
下面是一个例子,用time() 函数来获得系统时间的秒数,并随机种子给rand() 函数。在使用时,我们需要包含<ctime>头文件。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main () {
srand(time(0));
for (int x = 1; x <= 10; x++) {
cout << 1 + (rand() % 5) << endl;
}
}
time(0) 将返回当前秒数,提示srand() 函数每次程序运行时为rand() 函数设置一个不同的种子。
提示:每次我们运行程序时,使用这个种子值将会创建一个不同的输出。
参数的默认值
当您定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。
这是通过在函数定义中使用赋值运算符来为参数赋值的。请看下面的实例:
int sum(int a, int b=17) {
int result = a + b;
return (result);
}
这为b参数赋值了一个默认值17,如果我们调用函数而不传递b参数的值,将使用默认值。
int main() {
int x = 12;
int y = 18;
//用x和y两个参数调用函数
int result = sum(x, y);
cout << result << endl;
//输出 30
//不用b调用函数
result = sum(x);
cout << result << endl;
//输出 29
return 0;
}
在代码中,对函数的第二次调用不会传递第二个参数的值,而是使用默认值17。
使用默认参数
现在,让我们来看另外一个例子:
int area(int x=1, int y=1) {
return x*y;
}
int main() {
cout << area() << endl;
cout << area(6) << endl;
cout << area(3, 5) << endl;
}
/* 输出
1
6
15
*/
如你所见,当不使用一个或多个参数时,可以使用默认参数值在不同的情况下调用相同的函数。
函数重载
在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型)必须不同。
例如,您可能需要一个rhzTest() 函数来打印其参数的值。
void rhzTest(int a) {
cout << a;
}
这只对整型参数有效。重载它将使其可用于其他类型,如浮点型。
void rhzTest(float a) {
cout << a;
}
现在,相同的rhzTest() 函数名称将适用于整数和浮点数。
函数重载
当重载函数时,函数的定义必须根据参数列表中的参数的个数、或类型而不同。
下面是一个例子:
void rhzTest(int x) {
cout << "整数为: " << x << endl;
}
void rhzTest(float x) {
cout << "浮点数为: " << x << endl;
}
int main() {
int a = 30;
float b = 68.652;
rhzTest(a);
rhzTest(b);
}
/* 输出:
整数为: 30
浮点数为: 68.652
*/
如你所见,函数调用是基于提供的参数。一个整数参数将调用带有整数参数的函数实现,一个浮点数参数将调用执行一个浮点数参数。
函数重载
不能仅通过返回类型的不同来重载函数。
下面的声明将导致错误。
int rhzTest(int a) {}
float rhzTest(int b) {}
string rhzTest(int c) {}
虽然每个函数都使用相同的名称,但唯一的区别是返回类型,这是不允许的。
文章评论