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++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

C++读写word文档(.docx)DuckX库的使用详解

《C++读写word文档(.docx)DuckX库的使用详解》DuckX是C++库,用于创建/编辑.docx文件,支持读取文档、添加段落/片段、编辑表格,解决中文乱码需更改编码方案,进阶功能含文本替换... 目录一、基本用法1. 读取文档3. 添加段落4. 添加片段3. 编辑表格二、进阶用法1. 文本替换2

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键