我想添加一个选项,在我的项目中包含一个Integer和Double类,并希望得到一些帮助,因为我被卡住了。
头:
#ifndef RANDOM
#define RANDOM
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include "Double.h"
const int Int_b = 250;//these are for main
const int Int_s = 225;
class Random
{
private:
std::vector<double> vectx;
double _min, _max;
int currIndex;
void fillVect(double min, double max);
//void fillVect(Double min, Double max);
void shuffle();
public:
Random();
Random(double min, double max);
//Random(Double min, Double max);
Random(int seed);
int nextInt();
//Integer nextInteger();
double nextDbl();
//Double nextDouble();
//void setRange(Double min, Double max);
void setRange(double min, double max);
};
#endif
评论代码是我想添加的代码
CPP:
#include "Random.h"
#include "Double.h"
using namespace std;
Random::Random() {
srand(unsigned(time(0)));
fillVect(0.0, RAND_MAX);
}
Random::Random(double min, double max) {
srand(unsigned(time(0)));
fillVect(min, max);
}
/*Random::Random(Double min, Double max)
{
srand(unsigned(time(0)));
fillVect(min, max);
}*/
Random::Random(int seed) {
srand(seed);
fillVect(0.0, RAND_MAX);
}
void Random::fillVect(double min, double max) {
vectx.clear();
currIndex = 0;
for (unsigned i = 0; i < Int_b; ++i)
{
double r = (((double)rand() / (double)RAND_MAX * (max - min)) + min);
vectx.push_back(r);
}
shuffle();
}
/*void Random::fillVect(Double min, Double max) {
vectx.clear();
currIndex = 0;
for (unsigned i = 0; i < Int_b; ++i)
{
Double r = (((Double)rand() / (Double)RAND_MAX * (max - min)) + min);
vectx.push_back(r);
}
shuffle();
}*/
void Random::shuffle() {
random_shuffle(vectx.begin(), vectx.end());
}
int Random::nextInt() {
if (currIndex > Int_s)
{
currIndex = 0;
shuffle();
}
return (int)vectx[currIndex++];
}
double Random::nextDbl() {
if (currIndex > Int_s)
{
currIndex = 0;
shuffle();
}
return vectx[currIndex++];
}
void Random::setRange(double min, double max) {
vectx.clear();
fillVect(min, max);
}
这是我的尝试,但我无法绕过它。
这是我的双课。
class Double
{
private:
double data;
public:
Double();
Double(double d);
Double(const Double &d);
Double(const Integer &i);
void equals(double d);
Double add(const Double &d);
Double sub(const Double &d);
Double mul(const Double &d);
Double div(const Double &d);
Double add(double d);
Double sub(double d);
Double mul(double d);
Double div(double d);
double toDouble() const;
Double operator + (const Double &d);
Double operator - (const Double &d);
Double operator * (const Double &d);
Double operator / (const Double &d);
Double operator = (const Double &d);
Double operator = (double d);
bool operator == (const Double &d);
bool operator == (double d);
bool operator != (const Double &d);
bool operator != (double d);
};
答案 0 :(得分:0)
在
Random::Random(Double min, Double max)
你能做的最好的事情是
Random::Random(Double min, Double max)
{
fillVect(min.toDouble(), max.toDouble());
}
并将void Random::fillVect(Double min, Double max)
的概念视为冗余。但如果你必须实现它,那么
Random::Random(Double min, Double max)
{
fillVect(min, max);
}
void Random::fillVect(Double min, Double max) {
vectx.clear();
currIndex = 0;
for (unsigned i = 0; i < Int_b; ++i)
{
double r = (((double)rand() / (double)RAND_MAX * (max.toDouble() - min)) + min.toDouble());
vectx.push_back(r);
}
shuffle();
}
但要注意这是愚蠢的。对fillVect
算法所做的任何更改都必须在两个地方进行,这会打开整个系列的可能错误。假设您改变一个而忘记改变另一个。或者您发现了一个错误,只能将其修复为一个错误。或者因为拼写错误,你只有一个错误。重复的代码浪费时间编写,调试和维护。为了什么?所以你在另一个地方打电话给toDouble
(可能现在已经多次了for
循环。请阅读“循环提升”来解决这个问题?)
Double nextDouble();
利用Double::Double(double d)
。
答案 1 :(得分:-3)
为什么当一个简单的演员可以完成这项工作时重复自己? 例如,您可以说:
fillVect( min.toDouble(), max.toDouble() )
最小和最大是双重类型。