📜  std :: mt19937 C++中的类

📅  最后修改于: 2021-05-30 08:00:19             🧑  作者: Mango

std :: mt19937 (自C++ 11起)类是一种非常有效的伪随机数生成器,并且在随机头文件中定义。它使用著名的流行算法Mersenne twister算法生成32位伪随机数。 std :: mt19937类基本上是std :: mersenne_twister_engine类的一种。

typedef mersenne_twister_engine
 mt19937;

句法 :

mt19937 mt1(seed_value);

此处mt1是mt19937类的实例,它使用种子值来生成整个序列。

mt19937名称的含义

mt19937代表较长时间为2 19937 – 1的梅森捻线机,这意味着mt19937产生一个32位整数序列,该序列仅在生成2 19937 – 1个数字后才会重复。

mt19937与rand()和srand()之间的相似之处:

std :: mt19937做两件事–

  • 实例化std :: mt19937对象时,它采用一个用于生成种子值的参数(例如srand())。
  • 通过使用运算符(),它会生成一个随机数(如rand())。

下面是演示相似之处的示例:

C++
// C++ program for demonstrating 
// similaritites
#include 
#include 
#include 
using namespace std;
  
int main()
{
  // Initializing the sequence 
  // with a seed value
  // similar to srand()
  mt19937 mt(time(nullptr)); 
  
  // Printing a random number
  // similar to rand()
  cout << mt() << '\n'; 
  return 0;
}


C++
// C++ program to implement 
// the above concept
  
// This header file is 
// for time
#include  
#include 
#include 
using namespace std;
  
int main()
{
  // Using the constructor to
  // initialize with a seed value
  mt19937 mt(time(nullptr)); 
  
  // Operator() is used to 
  // generate random numbers
  cout << mt() << '\n';
  return 0;
}


C++
// C++ program for the 
// min()
#include 
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Initializing mt19937
  // object
  mt19937 mt(time(nullptr));
  
  // Prints the minimum value 
  // which is 0
  cout << "the minimum integer it can generate is " << 
           mt.min() << endl; 
  return 0;
}


C++
// C++ program to demonstrate 
// max()
#include 
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Initializing mt19937
  // object
  mt19937 mt(time(nullptr)); 
    
  // Prints the maximum value
  // which is 4294967295
  cout << "mt19937 can generate random numbers upto " << 
           mt.max() << endl; 
  return 0;
}


C++
// C++ program to demonstrate
// seed()
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Defining the 
  // mt19937 object
  mt19937 mt; 
    
  // Initializing a random 
  // sequence with a seed value
  mt.seed(45218965); 
    
  cout << "some random numbers generated by mt19937 are:" << 
           endl;
    
  for (int i = 5; i > 0; i--) 
  {
    cout << mt() << ' ';
  }
  return 0;
}


C++
// C++ program to demonstrate
// operator()
#include 
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Initializing mt19937
  // object
  mt19937 mt(time(nullptr));
    
  for (int i = 0; i < 5; i++) 
  {
    // operator() is used to
    // generate random numbers
    cout << mt() << ' '; 
  }
  return 0;
}


C++
// C++ program to demonstrate 
// operator>>() and <
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  mt19937 mt;
  cout << "enter a integer to begin" << 
           endl;
    
  // operator>>() is used to get 
  // a seed value from the user
  cin >> mt; 
    
  // <


C++
// C++ program to demonstrate
// above approach
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  mt19937 mt1(10000);
  mt19937 mt2(100000);
  
  cout << mt1() << endl;
  cout << mt2() << endl;
  return 0;
}


输出
3529725061

作为std :: mersenne_twister_engine类的一种,它具有与mersenne_twister_engine相同的成员函数。以下是一些重要的成员函数列表–

1.(构造函数):构造mt19937对象。它采用结果类型的种子值或种子序列对象(类似于srand()函数)。

例子 :

C++

// C++ program to implement 
// the above concept
  
// This header file is 
// for time
#include  
#include 
#include 
using namespace std;
  
int main()
{
  // Using the constructor to
  // initialize with a seed value
  mt19937 mt(time(nullptr)); 
  
  // Operator() is used to 
  // generate random numbers
  cout << mt() << '\n';
  return 0;
}
输出
3529725061

2. min():返回运算符()可以返回的最小值(为零)。

例子:

C++

// C++ program for the 
// min()
#include 
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Initializing mt19937
  // object
  mt19937 mt(time(nullptr));
  
  // Prints the minimum value 
  // which is 0
  cout << "the minimum integer it can generate is " << 
           mt.min() << endl; 
  return 0;
}
输出
the minimum integer it can generate is 0

3. max():返回最大值运算符()可以返回(即2 32 – 1 = 4294967295)

例子 :

C++

// C++ program to demonstrate 
// max()
#include 
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Initializing mt19937
  // object
  mt19937 mt(time(nullptr)); 
    
  // Prints the maximum value
  // which is 4294967295
  cout << "mt19937 can generate random numbers upto " << 
           mt.max() << endl; 
  return 0;
}
输出
mt19937 can generate random numbers upto 4294967295

4. seed():通过获取结果类型的种子值或通过获取种子序列对象来重新初始化对象的种子值。

例子 :

C++

// C++ program to demonstrate
// seed()
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Defining the 
  // mt19937 object
  mt19937 mt; 
    
  // Initializing a random 
  // sequence with a seed value
  mt.seed(45218965); 
    
  cout << "some random numbers generated by mt19937 are:" << 
           endl;
    
  for (int i = 5; i > 0; i--) 
  {
    cout << mt() << ' ';
  }
  return 0;
}
输出
some random numbers generated by mt19937 are:
3334444225 240363925 3350157104 146869560 639267854

5. 运算符():生成伪随机整数。(类似于rand()函数)。

例子:

C++

// C++ program to demonstrate
// operator()
#include 
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  // Initializing mt19937
  // object
  mt19937 mt(time(nullptr));
    
  for (int i = 0; i < 5; i++) 
  {
    // operator() is used to
    // generate random numbers
    cout << mt() << ' '; 
  }
  return 0;
}
输出
3529725061 3019704141 2006641117 725527349 3631905871

还有一些非成员函数可以重载以与std :: mt19937对象一起工作。这些都是 –

  • 运算符<<() –这是重载的,因此我们可以直接将mt19937对象生成的值打印到输出流。
  • 运算符>>() –用于从输入中提取种子值。

这是一个简单的示例,可以通过从用户那里获取种子值来生成伪随机数–

使用运算符<<()和运算符>>():

例子 :

C++

// C++ program to demonstrate 
// operator>>() and <
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  mt19937 mt;
  cout << "enter a integer to begin" << 
           endl;
    
  // operator>>() is used to get 
  // a seed value from the user
  cin >> mt; 
    
  // <
输出
enter a integer to begin
a random number 3499211612 is generated

为什么使用mt19937代替rand()?

尽管rand()函数可以在很小的范围内使用,但是它对于生成像随机数这样的真实世界是无效的。细心的人可以观察到rand()生成的随机数的重复,这是非常危险的。而std :: mt19937具有以下优点–

  1. 与rand()相比,它的周期很长。这将需要更长的时间。如果Mersenne扭曲器的实现每秒可以生成10亿(十亿)个伪随机数,那么一个生成伪随机数的程序将需要运行约1.3684×105,985年才能重复该随机序列。因此可以安全地假设观察者永远不会猜出这个数字。
  2. 可以使用不同的种子值同时启动许多随机数生成器。这是一个例子–

C++

// C++ program to demonstrate
// above approach
#include 
#include 
using namespace std;
  
// Driver code
int main()
{
  mt19937 mt1(10000);
  mt19937 mt2(100000);
  
  cout << mt1() << endl;
  cout << mt2() << endl;
  return 0;
}
输出
2342776460
1235064505
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”