Visual C++2008 C++ TR1 随机数编程笔记

2024-02-26 21:32

本文主要是介绍Visual C++2008 C++ TR1 随机数编程笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

At the core of any pseudorandom number generation software is a routine for generating uniformly distributed random integers. 
In C++ TR1 you have your choice of several core generators that it calls “engines.” The following four engine classes are supported in the Visual Studio 2008 feature pack

 (微软已经发布了Visual Studio 2008的Services Pack 1,它包含了此前发布的feature pack,以及完整的TR1支持,后来又发布了一个修正:VC 2008 SP1: Problems with STL/TR1 after installing VS2008 SP1,关于:VC9 SP1 Hotfix For The vector<function<FT>> Crash,关于文档:微软TR1文档).

  • linear_congruential uses a recurrence of the form x(i) = (A * x(i-1) + C) mod M
  • mersenne_twister implements the famous Mersenne Twister algorithm
  • subtract_with_carry uses a recurrence of the form x(i) = (x(i - R) - x(i - S) - cy(i - 1)) mod M in integer arithmetic
  • subract_with_carry_01 uses a recurrence of the form x(i) = (x(i - R) - x(i - S) - cy(i - 1)) mod 1 in floating point arithmetic

Each engine has a seed() method that accepts an unsigned long argument to specify the random number generation seed. It is also possible to set the seed in more detail using template parameters unique to each engine.

微软的C++ TR1可以生成以下分布的随机数:

 

Generates a Bernoulli distribution.
Generates a binomial distribution.
Generates an exponential distribution.
Generates a gamma distribution.
Generates a geometric distribution.
Generates a normal distribution.
Generates a Poisson distribution.
Generates a uniform integer distribution.
Generates a uniform floating-point distribution.

 

试验一:在VS2008中先建一空的VC++项目文件,然后添加新建项cpp文件如下:

#include <random>
#include <iostream>

void main(){
 std::tr1::mt19937 eng;  // a core engine class:Mersenne Twister generator
 std::tr1::normal_distribution<double> dist; 
 std::tr1::uniform_int<int>  unif(1, 52); 
 
 for (int i = 0; i < 10; ++i)    //产生正态分布的10个随机数
  std::cout << dist(eng)<<std::endl;
 
 for(int i = 0; i < 5; ++i)      //产生均匀分布的在1到52之间的五个整数随机数
  std::cout << unif(eng) << std::endl;
}

 

 

在循环中,每循环一次,就调用mt19937 eng一次,产生一个随机数输出。

试验二:关于种子seed

 #include <random>
#include <iostream>
#include <time.h>


void main(){
 std::tr1::mt19937 eng;  // a core engine class:Mersenne Twister generator
 std::tr1::normal_distribution<double> dist; 
 std::tr1::uniform_int<int>  unif(1, 52); 
 eng.seed((unsigned int)time(NULL)); // reseed base engine 设置种子用#include <time.h>, 不能用#include <time>
 
 for (int i = 0; i < 10; ++i)    //产生正态分布的10个随机数
  std::cout << dist(eng)<<std::endl;
 //eng.seed(); // reseed base engine
 for(int i = 0; i < 5; ++i)      //产生均匀分布的在1到52之间的五个整数随机数
  std::cout << unif(eng) << std::endl;
}

 试验三:随机数写入文件

#include <random>
#include <iostream>
#include <fstream>
#include <time.h>

using namespace std;
using namespace std::tr1;

void main()
{
 mt19937 eng;  // a core engine class:Mersenne Twister generator
 normal_distribution<double> dist; 
 uniform_int<int>  unif(1, 52);  //uniform_int 类以相同的概率在一个范围内抽取整数,它的构造函数有两个参数,分别表示抽取范围的最大值和最小值,需要注意的是抽取范围是个闭区间,也就是这两个值也可能被抽取到。


 eng.seed((unsigned int)time(NULL)); // 设置种子用#include <time.h>, 不能用#include <time>

 for (int i = 0; i < 10; ++i)    //产生正态分布的10个随机数
  cout << dist(eng)<<endl;
 
 ofstream fileout("fileout.dat");
 for(int i = 0; i < 5; ++i)  //产生均匀分布的在1到52之间的五个整数随机数(含1和52),即[1,52]闭区间
  fileout << unif(eng)<< endl; 
 
 fileout.close();
}

试验四:第三方"Mersenne Twister"随机数生成程序使用试验(程序来源:Agner Foghttp://www.agner.org/random/)

// 使用说明:从网站下载压缩包,http://www.agner.org/random/randomc.zip
// 展开后,将其中的randomc.h头文件及mersenne.cpp文件Copy到项目文件夹,
// 并将它们加入到项目中,其中包括"Mersenne Twister"的实现

#include <iostream>
#include <time.h>
#include "randomc.h"      // define classes for random number generators

using namespace std;

void main()
{

 int seed = (int)time(0);            // random seed

 // choose one of the random number generators:
 CRandomMersenne RanGen(seed);       // make instance of random number generator
 cout<<"/n/nRandom integers in interval from 0 to 99:/n";
 for (int i = 0; i < 40; i++) {
  int ir = RanGen.IRandom(0,99);
  cout<<ir<<"  ";
 }
   
 cout <<endl;

 cout<<"/n/n/n/nRandom floating point numbers in interval from 0 to 1:/n";
 for (int i = 0; i < 40; i++) {
  float fr = RanGen.Random();
  cout<<fr<<"  ";
 }
 
 cout <<endl;
}

试验五:第三方"Mother-Of-All"随机数生成程序使用试验(程序来源:Agner Foghttp://www.agner.org/random/)

// 使用说明:从网站下载压缩包,http://www.agner.org/random/randomc.zip
// 展开后,将其中的randomc.h头文件及mother.cpp文件Copy到项目文件夹,
// 并将它们加入到项目中,其中包括"Mother-Of-All" generator invented by George Marsaglia 的实现

#include <iostream>
#include <time.h>
#include "randomc.h"      // define classes for random number generators

using namespace std;

void main()
{

 int seed = (int)time(0);            // random seed

 // choose one of the random number generators:
 CRandomMother RanGen(seed);       // make instance of random number generator
 cout<<"/n/nRandom integers in interval from 0 to 99:/n";
 for (int i = 0; i < 40; i++) {
  int ir = RanGen.IRandom(0,99);
  cout<<ir<<"  ";
 }
   
 cout <<endl;

 cout<<"/n/n/n/nRandom floating point numbers in interval from 0 to 1:/n";
 for (int i = 0; i < 40; i++) {
  float fr = RanGen.Random();
  cout<<fr<<"  ";
 }
 
 cout <<endl;
}

 

试验六:第三方"SFMT"随机数生成程序使用试验(程序来源:Agner Foghttp://www.agner.org/random/)

重要提示:在编译前,可以修改头文件sfmt.h中的#define MEXP以及下面相应的宏代码:Choose one of the possible Mersenne exponents. Higher values give longer cycle length and use more memory。SFMT利用了SSE2指令,速度最快,但只适合intel系列的部分芯片。

// 使用说明:从网站下载压缩包,http://www.agner.org/random/randomc.zip
// 展开后,将其中的头文件及sfmt.cpp文件Copy到项目文件夹,
// 并将它们加入到项目中,其中包括"SFMT" 的实现

#include <iostream>
#include <time.h>
#include "sfmt.h"      // define classes for random number generators

using namespace std;

void main()
{

 int seed = (int)time(0);            // random seed

 // choose one of the random number generators:
 CRandomSFMT1 RanGen(seed);  //注意可以是CRandomSFMT,是CRandomSFMT0,或CRandomSFMT1
 cout<<"/n/nRandom integers in interval from 0 to 99:/n";
 for (int i = 0; i < 40; i++) {
  int ir = RanGen.IRandomX(0,99);
  cout<<ir<<"  ";
 }
   
 cout <<endl;

 cout<<"/n/n/n/nRandom floating point numbers in interval from 0 to 1:/n";
 for (int i = 0; i < 40; i++) {
  float fr = RanGen.Random();
  cout<<fr<<"  ";
 }
 
 cout <<endl;
}

这篇关于Visual C++2008 C++ TR1 随机数编程笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750224

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C