使用random库产生随机数
default_random_engine
default_random_engine是C++标准库中的一个类模板,定义在头文件< random >中。它是一个确定性的伪随机数生成器,基于指定的种子产生一系列随机整数。默认情况下,该引擎使用默认种子进行初始化,但是可以通过seed函数将其设置为任何值。
default_random_engine与c语言的rand函数
rand和default_random_engine都是C++标准库中用于生成随机数的工具。
rand是在C语言标准库中定义的随机数生成器函数,其返回一个介于0到RAND_MAX(通常是32767)之间的整数。rand函数使用一个内部状态,它被称为伪随机数生成器(PRNG),因为它实际上不是真正的随机数生成器。PRNG的输出是看似随机的数字序列,但实际上是由一个数学算法生成的。rand函数每次被调用时都会返回不同的数字,但这些数字之间有一定的关联性,而且它们不能够提供真正的随机性。
相较于rand函数,C++11标准引入的default_random_engine是一个更好的随机数生成工具。它可以根据某个种子(seed)生成伪随机数序列,这个伪随机数序列可以被认为是更加随机的。默认情况下,default_random_engine使用的种子是时间,这意味着每次程序的运行都会得到不同的随机数序列。而且,default_random_engine还提供了一系列的随机数分布函数(如均匀分布、正态分布等),可以满足不同的需求。
综上所述,rand函数虽然在某些情况下可以用于生成伪随机数,但是default_random_engine是一个更加现代、灵活和可靠的随机数生成工具,尤其适用于需要高质量随机数的应用场景。
uniform_int_distribution
uniform_int_distribution是C++标准库中的一个类模板,定义在头文件< random >中。它用于在指定的范围内生成均匀分布的随机整数。简单来说,它可以将一个整数范围内的随机数均匀地分布在每个可能的整数值上。
uniform_int_distribution类模板可以接受两个整数类型的参数,第一个参数指定随机数生成的下界,第二个参数指定上界。当然,上界值也可以达到。使用uniform_int_distribution生成的随机数具有相等的可能性,即具有相同的概率分布。因此,它是一种非常有用的方法来模拟随机事件,例如掷骰子或抽奖。
产生随机数
产生随机数
//default_random_engine engine;//使用默认的种子
int seed = 1;//随机数种子
default_random_engine engine(seed);//指定随机数种子
cout<<"random number "<<engine();
产生0-100的随机数
default_random_engine engine(seed);
uniform_int_distribution<unsigned> distribution(0,100);
cout<<"random number "<<distribution(engine);
std::mt19937
std::mt19937是C++标准库中的一个伪随机数生成器,定义在头文件< random >中。它使用梅森旋转算法(Mersenne Twister)构建,可以产生高质量的随机数序列。
梅森旋转算法是一种基于线性同余算法的伪随机数生成器,它可以产生高质量的随机数序列,而且周期很长(2^19937-1),因此很难在实际应用中出现重复的随机序列。
使用std::mt19937生成随机数的过程如下:
1.创建一个std::mt19937对象,需要传入一个种子。
2.创建一个分布器,例如std::uniform_int_distribution,用于限制随机数的范围。
3.调用分布器的operator()函数,将生成器作为参数传入,即可产生一个随机数。
以下是一个使用std::mt19937生成随机数的示例,该示例生成5个在1到10之间的随机整数:
#include <iostream>
#include <random>
int main()
{
std::mt19937 generator(1234); // 设置初始种子为1234
std::uniform_int_distribution<int> distribution(1, 10);
for(int i = 0; i < 10; i++)
{
int random_number = distribution(generator);
std::cout << random_number << " ";
}
std::cout << std::endl;
return 0;
}
生成大量不重复的随机数
#include <iostream>
#include <random>
#include <chrono>
#include <memory.h>
using namespace std;
int array[1000000] = {-1};//存放随机数的数组
int seed = 1;//种子
//generate distinct number
void fill_array(int arg){
cout<<"generate "<<arg<<" distinct number\n";
default_random_engine e1(seed);
uniform_int_distribution<unsigned> u(0,9999999);
memset(array,-1,1000000);
for(int i=0;i<arg;){
int r = u(e1);
bool f = false;//duplicate flag
for(int j=0;array[j]!=-1;j++){//check duplicate number
if(array[j]==r){
f = true;
break;
}
}
if(!f){//no duplicate
array[i] = r;
i++;
}
if(i%10000 == 0){
cout<<i<<" random number generated\n";
}
}
cout<<"generate distinct number complete\n";
}
int main(){
fill_array(150000);
return 0;
}
产生0-9999999的100 000不重复的随机数,大约用了5秒
generate 100000 distinct number
10000 random number generated
20000 random number generated
30000 random number generated
40000 random number generated
50000 random number generated
60000 random number generated
70000 random number generated
80000 random number generated
90000 random number generated
100000 random number generated
generate distinct number complete