如何在C++中创建随机数生成器

时间:2020-02-23 14:30:03  来源:igfitidea点击:

在本文中,我们将介绍在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的几种用法。

密码学

不可预测性被认为是加密领域的一种安全措施。
因此,大量使用随机数生成器,例如密钥和随机数。

游戏类

传统游戏包括骰子和纸牌混洗,以引入游戏的随机性,从而增加了乐趣和不确定的结果。
类似地,现代游戏开发具有前后随机性的概念,这为游戏增加了另外的维度。

随机算法

在这些算法中,向已知算法引入了一定程度的随机性。
最重要的是,这些算法的目的是通过权衡成功概率来获得更好的性能。