
C++随机数生成示例详解
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
本篇文章详细介绍了在C++中如何使用标准库函数来生成随机数,并提供了实用示例代码以帮助读者更好地理解和应用。
在C++编程中生成随机数是一项常见的任务,在模拟、游戏开发或测试等领域尤为常见。本段落将深入探讨如何在C++中生成0到N-1之间的等概率随机数,并提供两种不同的实现方法。
一种常见的做法是使用`srand`和`rand`函数,其中`srand`用于设置随机数种子,通常通过当前时间来确保每次程序运行时产生不同的序列。而`rand()`则返回一个在0至RAND_MAX(不包括RAND_MAX)之间的随机整数。然而,在需要特定范围内生成随机数时,直接使用`rand() % N`并不总是理想的选择,因为这可能导致某些数字出现的概率高于其他数字。这是由于RAND_MAX可能不是N的倍数,从而造成分布不均。
为了解决这个问题,我们可以采用以下策略:
1. **去除尾数**:
如果需要生成0到N-1之间的随机整数且N小于RAND_MAX+1,可以计算出RAND_MAX对N取模的结果R。随后不断生成新的随机数t直到它小于R,并使用`t % n`得到结果。这种方法确保了所有数字出现的概率相等。
```cpp
long myrandom1(long n) {
long R = RAND_MAX - (RAND_MAX + 1) % n;
long t = rand();
while (t > R) {
t = rand();
}
return t % n;
}
```
2. **分段抽样**:
当N大于RAND_MAX时,可以将区间[0, N-1]分成[N(RAND_MAX+1)]段。首先随机选择一个段,然后在该段内生成随机数。如果N不能被RAND_MAX + 1整除,则先以概率r/N选到余数部分,并在此范围内生成随机数。
```cpp
long myrandom2(long n) {
long r = n % (RAND_MAX + 1);
if (happened((double)r / n)) { // happened函数用于模拟概率事件,此处省略具体实现。
return n - r + myrandom(r);
} else {
return rand() + myrandom(n / (RAND_MAX + 1)) * (RAND_MAX + 1);
}
}
```
此外,C++11引入了 `
全部评论 (0)


