自从我处理这个问题以来已经有几个小时了。我想知道是否有人可以指出我做错了什么,如果可能的话 - 如何解决它。本质上,我只是尝试生成n
多个对象对并将它们存储到vector<pair<Foo, Foo>>
. 该算法涉及随机数生成器。我使用 STL<random>
及其组件,如m19937
、uniform_real_distribution
和uniform_int_distribution
。下面是我正在尝试做的代表我手头案例的简化版本。第二个循环总是缩短。但是,我看不出原因。从本质上讲,我永远不会看到程序完全执行。最后两条消息从不显示。
程序
#include <iostream>
#include <vector>
#include <random>
#include <utility>
// utility
using std::pair;
// random
using std::mt19937;
using std::uniform_int_distribution;
using std::uniform_real_distribution;
// iostream
using std::cout;
using std::endl;
// vector
using std::vector;
class Event{
private:
double x, y;
public:
Event(const double X, const double Y);
};
Event::Event(const double X, const double Y): x(X), y(Y){}
int main(){
cout << "Initializing storage..." << endl;
vector<Event> population;
vector<pair<Event,Event>> selection;
cout << "Initializing necessary member variables..." << endl;
const unsigned int SEED = 14112017;
const unsigned int MAX_ITERATIONS = 10000;
const double MIN = 1;
const double MAX = 10000;
mt19937 engine(SEED);
cout << "Generating the initial population..." << endl;
uniform_real_distribution<> real_distribution(MIN, MAX);
for(unsigned int i = 0; i < MAX_ITERATIONS; ++i){
double x = real_distribution(engine);
double y = real_distribution(engine);
Event event(x, y);
population.push_back(event);
}
cout << "Success! The initial population has been generated successfully" << endl;
population.shrink_to_fit();
cout << "Starting the selection process..." << endl;
unsigned int random = 0;
uniform_int_distribution<> int_distribution(MIN, MAX);
for(unsigned int i = 0; i < MAX_ITERATIONS; ++i){
random = int_distribution(engine);
Event event_x = population.at(random);
random = int_distribution(engine);
Event event_y = population.at(random);
pair<Event, Event> bound(event_x, event_y);
selection.push_back(bound);
}
cout << "Success! The selection process has been completed successfully" << endl;
selection.shrink_to_fit();
cout << "population size: " << population.size() << endl;
cout << "selection size: " << selection.size() << endl;
return 0;
}
我使用 cygwins C++ 编译器编译上述内容,并在命令提示符下执行代码。操作系统是 Windows 10 x64。盒子有 32 GB 内存。
uniform_int_distribution
s 的构造函数如下:
explicit uniform_int_distribution( IntType a = 0,
IntType b = std::numeric_limits<IntType>::max() );
默认情况下,它返回一个整数,该整数涵盖该类型的所有正值。该范围包括第二个参数的值。如果不是,那么指定我们想要所有正整数会很麻烦。
cppreference.com 没有记录它,但 C++ 标准做了: 谢谢@Cubbi
这在 cppreference.com或 C++ 标准中有记录:
26.5.8.2.1 类模板 uniform_int_distribution [rand.dist.uni.int]
1 uniform_int_distribution 随机数分布产生随机整数 i,a ≤ i ≤ b,根据常数离散概率函数分布
[...]
// constructors and reset functions explicit uniform_int_distribution(IntType a = 0, IntType b = numeric_limits<IntType>::max());
这里:
uniform_int_distribution<> int_distribution(MIN, MAX);
for(unsigned int i = 0; i < MAX_ITERATIONS; ++i){
random = int_distribution(engine);
Event event_x = population.at(random);
random = int_distribution(engine);
Event event_y = population.at(random);
random
可以取MAX
超出population
向量范围的值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句