c++伪随机函数rand的lcg参数和公式,实现对应的伪随机函数,并以种子1和100测试其
时间: 2024-09-07 16:06:17 浏览: 23
C++标准库中的`<cstdlib>`头文件中的`rand()`函数是一个线性同余生成器(Linear Congruential Generator,LCG),它使用了一个简单的数学公式来生成看似随机的整数序列。LCG的基本形式通常如下面所示:
```cpp
unsigned int rand() {
static unsigned int seed = 1; // 初始种子,默认为1
seed = (seed * a + c) % m;
return seed;
}
```
这里的参数通常设置为:
- `a` (乘法系数): 一般取大于1的素数,比如31或61。
- `c` (增补项): 一个小于`m`的常数,保证循环。
- `m` (模数): 很大,通常为2^32(对于32位系统)或2^64(对于64位系统),用于限制生成值的范围。
举个例子,假设我们选择`a = 31`, `c = 1`, `m = 2^32`,那么每次计算新的随机数时,会按照这个公式更新种子:
```cpp
seed = (seed * 31 + 1) % (1 << 32);
```
你可以根据需要修改这些参数,但默认的`rand()`就是基于这种简单模型的。
现在,让我们编写一个测试程序,使用种子1和100分别初始化并打印5次随机数:
```cpp
#include <iostream>
#include <cstdlib>
int main() {
// 使用种子1
std::srand(1); // 初始化随机数发生器
for(int i=0; i<5; ++i) {
int random_num_1 = rand();
std::cout << "Random number with seed 1: " << random_num_1 << "\n";
}
// 使用种子100
std::srand(100);
for(int i=0; i<5; ++i) {
int random_num_100 = rand();
std::cout << "Random number with seed 100: " << random_num_100 << "\n";
}
return 0;
}
```
运行此程序,你会看到两个不同的随机数序列,因为它们是从不同的初始种子开始的。