C++:根据Stroustrup的示例设定随机数
我在修改下面第130页的示例以使用非确定性随机种子时遇到问题。我在Rand_ints构造函数中添加代码re{rd}时收到警告。我已经包括了这些警告,但不确定它们是什么意思或如何解决它们。有人知道吗 第130页修改代码以使用非确定性随机数:C++:根据Stroustrup的示例设定随机数,c++,C++,我在修改下面第130页的示例以使用非确定性随机种子时遇到问题。我在Rand_ints构造函数中添加代码re{rd}时收到警告。我已经包括了这些警告,但不确定它们是什么意思或如何解决它们。有人知道吗 第130页修改代码以使用非确定性随机数: #include <random> #include <iostream> #include <functional> using namespace std; class Rand_int { public: R
#include <random>
#include <iostream>
#include <functional>
using namespace std;
class Rand_int {
public:
Rand_int(int low, int high) :dist{low,high}, re{rd()} { }
int operator()() { return dist(re); } // draw an int
private:
random_device rd;
default_random_engine re;
uniform_int_distribution<> dist;
};
int main(int argc, char *argv[])
{
Rand_int rnd {1, 6};
vector<int> hist(7);
for (int i=0; i<200; i++)
++hist[rnd()];
for (size_t i=1; i<hist.size(); i++) {
cout << i << '\t';
for (int j=0; j!=hist[i]; ++j)
cout << '*';
cout << endl;
}
return 0;
}
#include <random>
#include <iostream>
#include <functional>
using namespace std;
int main(int argc, char *argv[])
{
using engine = default_random_engine;
using distribution = uniform_int_distribution<>;
random_device rd; // for seed
engine re{rd()};
distribution dist {1,6};
auto rand = bind(dist, re);
vector<int> hist(7);
for (int i=0; i<200; i++)
++hist[rand()];
for (size_t i=1; i<hist.size(); i++) {
cout << i << '\t';
for (int j=0; j!=hist[i]; ++j)
cout << '*';
cout << endl;
}
return 0;
}
警告:
test93.cc:13:32: warning: ‘Rand_int::dist’ will be initialized after [-Wreorder]
uniform_int_distribution<> dist;
^~~~
test93.cc:12:27: warning: ‘std::default_random_engine Rand_int::re’ [-Wreorder]
default_random_engine re;
^~
test93.cc:8:5: warning: when initialized here [-Wreorder]
Rand_int(int low, int high) :dist{low,high}, re{rd()} { }
^~~~~~~~
1 ********************************
2 *********************************
3 *************************************
4 ****************************************
5 ********************************
6 **************************
第127页和第128页中用于生成非确定性随机数的代码:
#include <random>
#include <iostream>
#include <functional>
using namespace std;
class Rand_int {
public:
Rand_int(int low, int high) :dist{low,high}, re{rd()} { }
int operator()() { return dist(re); } // draw an int
private:
random_device rd;
default_random_engine re;
uniform_int_distribution<> dist;
};
int main(int argc, char *argv[])
{
Rand_int rnd {1, 6};
vector<int> hist(7);
for (int i=0; i<200; i++)
++hist[rnd()];
for (size_t i=1; i<hist.size(); i++) {
cout << i << '\t';
for (int j=0; j!=hist[i]; ++j)
cout << '*';
cout << endl;
}
return 0;
}
#include <random>
#include <iostream>
#include <functional>
using namespace std;
int main(int argc, char *argv[])
{
using engine = default_random_engine;
using distribution = uniform_int_distribution<>;
random_device rd; // for seed
engine re{rd()};
distribution dist {1,6};
auto rand = bind(dist, re);
vector<int> hist(7);
for (int i=0; i<200; i++)
++hist[rand()];
for (size_t i=1; i<hist.size(); i++) {
cout << i << '\t';
for (int j=0; j!=hist[i]; ++j)
cout << '*';
cout << endl;
}
return 0;
}
类的成员按照声明的顺序初始化,而不管在成员初始值设定项列表中初始化它们的顺序如何。编译器错误非常具体,并指出您应该编写:
Rand_int(int low, int high) : re{rd()}, dist{low,high} { }
类的成员按照声明的顺序初始化,而不管在成员初始值设定项列表中初始化它们的顺序如何。编译器错误非常具体,并指出您应该编写:
Rand_int(int low, int high) : re{rd()}, dist{low,high} { }
编译器告诉您,Rand_int的数据成员将按照声明为rd、re、dist的顺序进行初始化,但这与您在构造函数的初始值设定项列表中指定它们的顺序不匹配:
dist{low,high}, re{rd()}
re{rd()}, dist{low,high}
此警告旨在提醒您re在dist之前初始化,即使您已按相反顺序指定它们。要解决此问题,只需重新排列初始值设定项列表:
dist{low,high}, re{rd()}
re{rd()}, dist{low,high}
这不会改变程序的行为,它只是使编译器警告静音。之所以会出现警告,是因为初始化顺序在这里很重要,重要的是rd在re之前初始化,例如,初始值设定项列表中的顺序不正确可能表示您希望以与实际不同的顺序进行初始化。编译器告诉您,Rand_int的数据成员将按照声明为rd的顺序进行初始化,然后重新,然后dist,但这与您在构造函数的初始值设定项列表中指定它们的顺序不匹配:
dist{low,high}, re{rd()}
re{rd()}, dist{low,high}
此警告旨在提醒您re在dist之前初始化,即使您已按相反顺序指定它们。要解决此问题,只需重新排列初始值设定项列表:
dist{low,high}, re{rd()}
re{rd()}, dist{low,high}
这不会改变程序的行为,它只是使编译器警告静音。之所以出现此警告,是因为这里的初始化顺序可能很重要。例如,rd在re之前初始化很重要,并且初始化器列表中的错误顺序可能表明您希望以与实际不同的顺序进行初始化。这是错误的:使用命名空间std;。不要那样做。您使用了vector,但不包括;那也很糟糕。您使用了size\u t,但没有包含声明size\u t的7个头文件中的任何一个。这很糟糕:使用namespace std;。不要那样做。您使用了vector,但不包括;那也很糟糕。您使用了size\u t,但没有包含声明size\u t的7个头文件中的任何一个。