如何用C++创建一个随机数生成器
在本篇文章中,我们将介绍在C++中创建随机数生成器所需的功能。在计算机世界中,随机数是增加匿名性和安全性的重要组成部分。
一个随机数生成器是创建伪随机数的基础。
伪随机数背后的思想是,计算机没有思考过程来选择随机数。因此,即使产生的输出数字看起来是随机的,其值实际上是经过数学计算得出的。
srand()和rand()函数
在C++中,srand()函数可以进行伪随机数计算。这个函数需要一个种子值作为随机数计算的基础。
srand(unsigned int seed_value)
通过种子值的帮助,srand()为rand()函数的伪随机数生成设置了舞台。
int random = rand();
然后,哇!我们成功完成了生成一个随机数的简单任务。然而,难的部分是理解随机数生成器背后的概念。
种子值的重要性
种子值决定了随机数的序列,如果同一个种子值被提供给函数,生成的一组数字将会相似。
srand()函数的默认种子值为1,因此rand()函数调用时如果没有提供新的种子值,仍然会产生一串随机数。问题在于每次使用相同的种子值运行程序,输出结果都会保持不变。
我们问题的一个简单解决方案是在每次运行程序时使用一个新鲜的种子值。每一秒钟发生了什么变化?- 时间。我们使用当前时间戳的概念作为当前的种子值。
使用以下方法可以创建一个时间戳:
time_t current_time = time(NULL);
当前时间变量保存自1970年以来经过的秒数。将此值传递给srand()函数,然后我们得到一串全新的伪随机数。
我们可以跳过将时间戳初始化为变量的步骤,直接将时间戳传递给函数。
srand((unsigned) time(NULL));
无论要生成多少个随机数,在程序中只需提供一次种子值。
使用C++编写完美的随机数生成器
以下代码展示了正确生成随机数的方法。
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
// Providing a seed value
srand((unsigned) time(NULL));
// Get a random number
int random = rand();
// Print the random number
cout<<random<<endl;
return 1;
}
输出:
1897776064
所生成的数字太巨大,不适用于正常计算。
在给定范围内生成随机数
有必要将随机数限制在特定范围内。为了实现这个目的,我们使用模 % 运算符。
例如,为了生成从0到9的随机数,我们可以使用:
int random = rand() % 10;
同样地,如果我们需要从1到9中取出随机数,我们使用:
int random = 1 + (rand() % 9);
一般方程可以表述为:
int random = offset + (rand() % range);
在上述等式中:
- offset – The starting point for the range of random numbers
- range – The number of values between first and the last possible random number including the limits.
例如,在10到100之间的一组随机数字中,偏移量为10,范围为91。
我们来运行一个程序示例,打印100到200之间的5个随机数。
#include<iostream>
#include<cstdlib>
using namespace std;
int main(){
// Providing a seed value
srand((unsigned) time(NULL));
// Loop to get 5 random numbers
for(int i=1; i<=5; i++){
// Retrieve a random number between 100 and 200
// Offset = 100
// Range = 101
int random = 100 + (rand() % 101);
// Print the random number
cout<<random<<endl;
}
return 1;
}
结果:
144
175
162
137
200
请澄清一点,如果未提供种子值,以上程序每次运行的输出将是相同的。尽管集合内的随机数是不同的,但完整的集合将是相同的。
随机数生成器(RNG)的应用领域
随机数生成的功能可能看起来有限,但实际上并非如此。因此,让我们来看看一些随机数生成器的用途。
密码学
在密码学领域,不可预测性被视为安全的衡量标准。因此,在密钥和随机数等方面广泛使用随机数生成器。
游戏
传统的游戏包括使用骰子和洗牌来为游戏引入随机性,从而增加了乐趣和不确定的结果。同样地,现代游戏开发具有先前和后续随机性的概念,为游戏增加了额外的维度。
随机算法
在这些算法中,对已知的算法引入了一定程度的随机性。最重要的是,这些算法的目的是通过权衡成功的可能性来实现更好的性能。
结论是
RNGs或PRNGs(伪随机数生成器)是现代网络安全和密码学的基石。这些RNGs的基本原理是通过一些计算生成看似随机的不同数字。
我们希望读者能够理解这篇文章。欢迎在下方留言提出任何问题或建议。