Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11从频繁变化的范围生成随机数_C++_C++11_Random_Prng_Mersenne Twister - Fatal编程技术网

C++ C++;11从频繁变化的范围生成随机数

C++ C++;11从频繁变化的范围生成随机数,c++,c++11,random,prng,mersenne-twister,C++,C++11,Random,Prng,Mersenne Twister,问:如何从a-先验未知范围生成(许多)均匀分布的整数?就性能而言,首选的方式是什么(生成的数以百万计的数字) 上下文:在我的应用程序中,我必须在许多地方生成许多伪随机数。我对生成器使用单例模式来保持应用程序运行的再现性。在我的例子中,分布始终是一致的,但问题是,有太多的可能范围,无法以C++11样式预先生成分布对象 我所尝试的:有两个明显的解决方案,第一个是一次性分布对象,第二个是使用模将随机数从尽可能宽的范围转换为所需的范围。但不知何故,我怀疑这些是最好的:) #包括 #包括 #包括“限制.h

问:如何从a-先验未知范围生成(许多)均匀分布的整数?就性能而言,首选的方式是什么(生成的数以百万计的数字)

上下文:在我的应用程序中,我必须在许多地方生成许多伪随机数。我对生成器使用单例模式来保持应用程序运行的再现性。在我的例子中,分布始终是一致的,但问题是,有太多的可能范围,无法以C++11样式预先生成分布对象

我所尝试的:有两个明显的解决方案,第一个是一次性分布对象,第二个是使用模将随机数从尽可能宽的范围转换为所需的范围。但不知何故,我怀疑这些是最好的:)

#包括
#包括
#包括“限制.h”
使用名称空间std;
mt19937mt;
均匀分布*固定分布;
均匀分布*可变分布;
//此版本只需使用一次即可创建和删除dist
int getIntFromRange1(int-from,int-to){
variableDist=新的均匀分布(从,到);
int num=(*变量dist)(mt);
删除variableDist;
返回num;
}
//这个版本包含模
int getIntFromRange2(int-from,int-to){
int num=(*fixedDist)(mt);
int diff=到-从;
num=num%diff;
返回num+from;
}
int main(){
种子山(123456);
fixedDist=新的统一整数分布(0,整数最大值)
int a=getIntFromRange1(1,10);//1和10仅用于说明
int b=getIntFromRange2(1,10);//可以自由更改
我会的

int getIntFromRange1(int from, int to){
    std::uniform_int_distribution<int> dist(from, to);
    return dist(mt);
}
int-getIntFromRange1(int-from,int-to){
标准:统一分布区(从、到);
返回区(mt);
}
我会这样做:分发对象应该是轻量级的,因此当您需要一个随机数时构建一个新的分发既简单又快速(随机引擎很昂贵)

但是你也可以考虑这个实现:

inline int get_int_from_range(int from, int to)
{
  using distribution_type = std::uniform_int_distribution<int>;
  using param_type = typename distribution_type::param_type;

  thread_local distribution_type dist;
  return dist(mt, param_type(from, to));
}
inline int get_int_from_range(int from,int to)
{
使用分布类型=标准::均匀分布;
使用param_type=typename分布类型::param_type;
线程\本地分布\类型分布;
返回距离(mt,参数类型(从,到));
}
理由是可能存在需要存储值/状态的分布


整数和均匀分布可能不是这种情况,但有趣的是,在中使用了这种技术。

这比我的好一点,我承认:-)这是你能得到的最好结果。均匀分布只不过是两个值的占位符(只是一个类似pair的参数类型的包装器).compiler将很好地优化它(不涉及分配)。我想我必须接受答案,谢谢大家的帮助!
inline int get_int_from_range(int from, int to)
{
  using distribution_type = std::uniform_int_distribution<int>;
  using param_type = typename distribution_type::param_type;

  thread_local distribution_type dist;
  return dist(mt, param_type(from, to));
}