如何在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);
" current_time"变量保存自1970年1月以来经过的秒数。
此值传递给" 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 –随机数范围的起点
- range –第一个和最后一个可能的随机数之间的值数,包括限制。
例如,在10至100之间的一组随机数中,我们将offset设置为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)的应用
随机数生成的功能看似有限,但实际上并非如此。
因此,让我们看一下RNG的几种用法。
密码学
不可预测性被认为是加密领域的一种安全措施。
因此,大量使用随机数生成器,例如密钥和随机数。
游戏类
传统游戏包括骰子和纸牌混洗,以引入游戏的随机性,从而增加了乐趣和不确定的结果。
类似地,现代游戏开发具有前后随机性的概念,这为游戏增加了另外的维度。
随机算法
在这些算法中,向已知算法引入了一定程度的随机性。
最重要的是,这些算法的目的是通过权衡成功概率来获得更好的性能。