在the
documentation
属于
std::uniform_real_distribution
,初始化均匀实数随机数生成器的符号是使用圆括号:
std::uniform_real_distribution rand01(0,1)
但是,当我将其定义为类变量的成员时:
#include <iostream>
#include <random>
class randomnumber
{
public:
randomnumber()
{
std::random_device rd;
generator.seed(rd());
};
double get_rn()
{
return rand01(generator);
}
private :
std::mt19937 generator;
std::uniform_real_distribution<double> rand01(0.,1.);
};
int main(int argc,char *argv[])
{
randomnumber randnum;
for(int i=0;i<100;i++)
std::cout << randnum.get_rn() << std::endl;
}
编译器失败,出现错误:
randtest.cpp:20:53: error: expected identifier before numeric constant
20 | std::uniform_real_distribution<double> rand01(0.,1.);
| ^~
randtest.cpp:20:53: error: expected â,â or â...â before numeric constant
randtest.cpp: In member function âdouble randomnumber::get_rn()â:
randtest.cpp:15:24: error: cannot convert âstd::mt19937â {aka âstd::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>â} to âintâ
15 | return rand01(generator);
| ^~~~~~~~~
| |
| std::mt19937 {aka std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>}
randtest.cpp:20:53: note: initializing argument 1 of âstd::uniform_real_distribution<double> randomnumber::rand01(int)â
20 | std::uniform_real_distribution<double> rand01(0.,1.);
修复方法是使用花括号
{}
而不是圆括号
()
.
问题是,这是一个根本性的解决方案吗?意思是,我可以信任固定代码吗
{}
总是生成0到1之间的均匀随机数?
同样,对于类似情况的未来目的,如果有人能解释一下编译器为什么以这种方式运行,那就太好了。
我用来编译
g++
g++ -std=c++11 randtest.cpp
:
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.