基于 intel MKL 的高性能随机数生成器
2017-04-20 14:07
1051 查看
这个类基于 intel Math Kernel Library 的随机数生成器,可以生成平均分布的 int/float/double。保持接口与 C++11 一致,即:对于 int,生成范围是 [a, b];对于 float 与 double,生成范围是 [a, b)。
不需要每次去初始化种子。只需要随时调用即可,每次调用都可以得到不同的随机数。
代码如下(编译时需要指定 -std=c++11):
使用方法非常简单。以随机生成 int 为例:
在循环中使用时也无需再考虑初始化种子的问题,直接使用即可。例如:
同一个对象可以对不同的区间重复使用,直到此对象析构。例如:
转载请注明本文地址 http://blog.csdn.net/luozhen07/article/details/70257856 。
不需要每次去初始化种子。只需要随时调用即可,每次调用都可以得到不同的随机数。
代码如下(编译时需要指定 -std=c++11):
#ifndef RANDOM_NUMBER_CLASS_H #define RANDOM_NUMBER_CLASS_H #include <mkl.h> template<typename Type> class Random { public: Random(); Random(const Random&) = delete; Random(Random&&) = delete; Random& operator=(const Random&) = delete; Random& operator=(Random&&) = delete; ~Random(); Type operator()(Type left, Type right); private: VSLStreamStatePtr stream; }; // creates and initializes a random stream // use Mersenne-Twister pseudorandom number generator: VSL_BRNG_MT19937 // use time counter on CPU instruction level (ASM): __rdtsc() // __rdtsc() returns the CPU time stamp template<typename Type> inline Random<Type>::Random() { vslNewStream(&stream, VSL_BRNG_MT19937, __rdtsc()); } // deletes the random stream template<typename Type> inline Random<Type>::~Random() { vslDeleteStream(&stream); } // template specialization: int // randomly return an int in the section [left, right] template<> inline int Random<int>::operator()(int left, int right) { int retValue; viRngUniform(VSL_RNG_METHOD_UNIFORM_STD, stream, 1, &retValue, left, right + 1); return retValue; } // template specialization: float // randomly return a float in the section [left, right) template<> inline float Random<float>::operator()(float left, float right) { float retValue; vsRngUniform(VSL_RNG_METHOD_UNIFORM_STD, stream, 1, &retValue, left, right); return retValue; } // template specialization: double // randomly return a double in the section [left, right) template<> inline double Random<double>::operator()(double left, double right) { double retValue; vdRngUniform(VSL_RNG_METHOD_UNIFORM_STD, stream, 1, &retValue, left, right); return retValue; } #endif // !RANDOM_NUMBER_CLASS_H
使用方法非常简单。以随机生成 int 为例:
Random<int> rand; int ival = rand(0, 9); // 生成一个在区间 [0, 9] 内的随机数,0 和 9 都包括在内
在循环中使用时也无需再考虑初始化种子的问题,直接使用即可。例如:
Random<int> rand; for(int i = 0; i < 10; ++i) std::cout << rand(0, 9) << std::endl; // 每次输出一个 [0, 9] 区间内的随机整数,无需考虑种子问题
同一个对象可以对不同的区间重复使用,直到此对象析构。例如:
Random<int> rand; int ival1 = rand(0, 9); // 生成一个 [0, 9] 区间内的随机整数 int ival2 = rand(10, 19); // 生成一个 [10, 19] 区间内的随机整数
转载请注明本文地址 http://blog.csdn.net/luozhen07/article/details/70257856 。
相关文章推荐
- 试试 intel rng 随机数生成器
- 高性能Numpy/Scipy加速:使用Intel MKL和Intel Compilers或OpenBLAS(待续)
- 一种基于归并排序及随机数生成器对一个给定数组进行随机排列的算法
- 高性能Numpy/Scipy:使用Intel MKL和Intel Compilers
- 基于 intel MKL 的对称矩阵特征值求解器
- 随机数生成器
- 基于redis的分布式ID生成器
- 基于Oracle的高性能动态SQL程序开发
- 基于 CoreText 实现高性能 UITableView
- 基于CentOS构建高性能的LAMP平台
- 基于 CoreText 实现的高性能 UITableView
- 基于Oracle的高性能动态SQL程序开发
- 纯线性同余随机数生成器
- Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so
- 矩乘——BZOJ2875/Luogu2044 [Noi2012]随机数生成器
- 【BZOJ3671】[Noi2014]随机数生成器 暴力
- Linux 文件安全之随机数生成器 李晓辉
- BZOJ 2875 [Noi2012] 随机数生成器 题解与分析
- 谷歌Fuchsia OS开始基于Intel笔记本的测试,离正式揭面越来越近
- 基于win平台的高性能服务器底层通信模型设计(1)