在类实例化上生成数字

时间:2018-03-07 04:48:58

标签: c++ c++11

我正在使用OOP来创建一个基本类,我无法想象如何在主类中实例化每个武器时随机生成一个武器类型的数字。

//Weapon.h
class Weapon {

    int type;

public:
    Weapon();
    ~Weapon();


    int getType();
};

/////////////////////////////////////////////// ////////////////////////////////

//Weapon.cpp
#include "Weapon.h"
#include <cstdlib>
#include <time.h>

Weapon::Weapon()
{
    srand(time(NULL));
    type = rand() % 4;
}

Weapon::~Weapon() 
{
}

int Weapon::getType() {
    return type;
}

/////////////////////////////////////////////// ////////////////////////////////

//main.cpp
#include <iostream>
#include "Weapon.h"

int main() {

    Weapon w1, w2, w3;

    std::cout << "w1 is type #" << w1.getType() << "\n";
    std::cout << "w2 is type #" << w2.getType() << "\n";
    std::cout << "w3 is type #" << w3.getType() << "\n";

    return 0;
}

我得到的结果是: “w1是#1型” “w2是#1型” “w3是#0型”

每次我在Visual Studio中运行程序时,都会显示相同的数字,并且每次程序运行时它们都不会被随机化。我怎么做到这一点?我似乎忘记了c ++的基础知识,因为这对我来说似乎很容易,但我无法理解。

编辑:在Weapon.cpp中使用srand,我现在每次运行都会得到随机生成。但是所有武器都具有相同的类型值。每个实例化的武器如何具有不同的类型值?

2 个答案:

答案 0 :(得分:1)

所以可悲的是rand()是一个糟糕的随机数生成器...你需要在srand(something)经常srand(time(NULL))的程序开头播种它,但我也是担心:

//Weapon.cpp
#include "Weapon.h"
#include <cstdlib>

int type;

你有一个与成员变量同名的全局...通常是不明智的......你可以用::typethis->type来访问它们,但为什么呢?

答案 1 :(得分:1)

    //test.h
#pragma once
#include <random>
#include <ctime>
std::default_random_engine e(time(0)); //global
class Weapon {


    int type;


public:
    Weapon();
    ~Weapon();


    int getType();
};
Weapon::Weapon()
{

    type = e() % 4;
}

Weapon::~Weapon()
{
}

int Weapon::getType() {
    return type;
}
//test.cpp
#include <iostream>
#include "test.h"

int main() {
    //srand(time(NULL));
    Weapon w1, w2, w3;

    std::cout << "w1 is type #" << w1.getType() << "\n";
    std::cout << "w2 is type #" << w2.getType() << "\n";
    std::cout << "w3 is type #" << w3.getType() << "\n";
    system("pause");
    return 0;
}

让你的引擎成为全局引擎,或者在你的代码中,将srand()移动到main。