【问题标题】:Generating a number on class instantiation [duplicate]在类实例化时生成一个数字[重复]
【发布时间】:2018-03-07 04:48:57
【问题描述】:

我正在使用 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,我现在可以在每次运行时随机生成。但是所有的武器都具有相同的类型值。每个实例化的武器如何具有不同的类型值?

【问题讨论】:

  • 随时间播种PRNGsrand(time(NULL))
  • @MateenUlhaq 浏览完之后,我现在每次运行都有一个随机数,但所有 3 种武器的值都相同。这将如何解决?
  • 只播种一次:srand(time(NULL)); 仅是main

标签: c++ c++11


【解决方案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 中。

【讨论】:

  • 这可行,但我不明白如何。
  • @originalwill 比较难,也许你可以搜索“线性同余生成器”获取更多信息,但记住你最好在进程开始时调用 srand() ^_^
【解决方案2】:

所以可悲的是rand() 是一个蹩脚的随机数生成器...您需要在程序开始时使用srand(something) 通常为srand(time(NULL)) 播种它,但我也担心:

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

int type;

您有一个与成员变量同名的全局变量...通常不明智...您可能可以使用 ::typethis-&gt;type 访问它们,但为什么呢?

【讨论】:

  • srand 现在可以在我每次运行程序时生成一个新的类型值,但每个实例化武器的值都是相同的。我如何让每个人都不同?
  • @oringinal 你会修改 2 吗,所以值只有 1 和 0 .. 如果你 %4 你可以有 0-3... 如果你 %6 你可以有 0 -5 等
  • 是的,我知道,但如果我将其设为%4 并让它打印出每个武器值,它们都是相同的值。我更新了 Weapon.cpp
  • @original你每次都在sranding吗?您只需执行一次。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 2020-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多