【问题标题】:How would I incorporate a class into this random generator?我如何将一个类合并到这个随机生成器中?
【发布时间】:2017-02-19 14:59:40
【问题描述】:

我想在我的项目中添加包含 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);
};

【问题讨论】:

  • 课程已经制作好了,我只是想把它们插入。
  • srand(unsigned(time(0))); 在构造函数中是个坏主意。每次创建该类的新实例时,您都将使用rand 为该类的所有实例和程序中的任何其他人重新植入 RNG。可能导致有趣的错误。 srand 应该只被调用一次,可能在 main 的早期。
  • 需要查看Double 课程才能提出任何有意义的建议。
  • 你遇到了什么问题?你看到错误了吗?还是对结果不满意?哪一个以及如何?
  • 我没有遇到问题,因为我什至不知道从哪里开始。我是否只是复制没有类的函数,然后用类替换它们?

标签: c++ class oop


【解决方案1】:

当一个简单的演员可以完成这项工作时,为什么要重复自己? 例如你可以说:

fillVect( min.toDouble(), max.toDouble() )

Min和max都是Double类型。

【讨论】:

  • 我怀疑Double 是否会特别好地转换为double。几乎可以肯定有非常不同的内存布局。最好在 OP 定义缺失的数据类型之前推迟回答此类问题。
【解决方案2】:

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)

【讨论】:

    猜你喜欢
    • 2011-07-19
    • 2023-01-03
    • 1970-01-01
    • 2012-09-12
    • 2021-03-04
    • 2011-06-14
    • 2015-06-22
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多