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++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函