【问题标题】:The code is printing the same values when it should be randomly generating each ovr and also it is not printing the first value in the array当代码应该随机生成每个 ovr 并且它没有打印数组中的第一个值时,它正在打印相同的值
【发布时间】:2014-07-25 16:03:44
【问题描述】:

我遇到的问题是,对于下面的代码,所有类对象的每个 plOvr 都是相同的。这导致他们对所有内容都有相同的统计数据。另外,我有一个数组,其名称应该被打印,但它跳过了第一个值。

using namespace std;

class Player
{
public:
    int plOvr;
    float plSpg, plSps;
    string werk;
    void setPlayeName(string);
    string plName;
    void setPlyrVal()
    {
        srand (time(NULL));
        plOvr = rand()% 29 + 70;
        plSps = plOvr / 10;
        plSpg = plSps / 2;
    }
};

void Player::setPlayeName(string werk)
{
 plName = werk;
}

int main()
{
    Player plyr1,plyr2,plyr3,plyr4,plyr5;
    string firstTime;
    string name[5] = {"Eric Gelinas","John Merill", "Jaromir Jagr", "Travis Zajac","Reid Boucher"};

    bool firstOp;

    cout << "Is this the first time this program has run?" << endl;
    cin >> firstTime;

    if (firstTime == "Yes" || firstTime == "yes")
    {
        firstOp == firstOp;
        plyr1.setPlyrVal();
        plyr1.setPlayeName(name[1]);
        plyr2.setPlyrVal();
        plyr2.setPlayeName(name[2]);
        plyr3.setPlyrVal();
        plyr3.setPlayeName(name[3]);
        plyr4.setPlyrVal();
        plyr4.setPlayeName(name[4]);
        plyr5.setPlyrVal();
        plyr5.setPlayeName(name[5]);
        ofstream playerSaveData;

        playerSaveData.open ("savedata.txt");

        playerSaveData << plyr1.plName << "," << plyr1.plOvr << "," << plyr1.plSpg << "," << plyr1.plSps << "\n";
        playerSaveData << plyr2.plName << "," << plyr2.plOvr << "," << plyr2.plSpg << "," << plyr2.plSps << "\n";
        playerSaveData << plyr3.plName << "," << plyr3.plOvr << "," << plyr3.plSpg << "," << plyr3.plSps << "\n";
        playerSaveData << plyr4.plName << "," << plyr4.plOvr << "," << plyr4.plSpg << "," << plyr4.plSps << "\n";
        playerSaveData << plyr5.plName << "," << plyr5.plOvr << "," << plyr5.plSpg << "," << plyr5.plSps << "\n";
        playerSaveData.close();

        cout << "done.\n";
    }
    else
    {
        firstOp == !firstOp;
    }

    return 0;
}

【问题讨论】:

  • 不要多次播种 rand。
  • 使用&lt;random&gt; 中的实用程序,而不是srandrand
  • string name[5] 的元素应该是 name[0] - name[4],而不是 name[1] - name[5]

标签: c++ arrays random


【解决方案1】:

您可以使用std::uniform_int_distribution&lt;int&gt;std::mt19937 来自&lt;random&gt; 的引擎。 引擎(如srand)只能用种子初始化一次。
你的程序重写了:

#include <ctime>
#include <iostream>
#include <fstream>
#include <string>
#include <random>

class Player
{
public:
    void setPlayeName(const std::string& name) { plName = name; }
    void setPlyrVal(std::mt19937& rand_engine)
    {
        std::uniform_int_distribution<int> distr(70, 98);
        plOvr = distr(rand_engine);
        plSps = plOvr / 10;
        plSpg = plSps / 2;
    }

public:
    int plOvr;
    float plSpg, plSps;
    std::string werk;
    std::string plName;
};

int main()
{
    std::mt19937 rand_engine(time(nullptr));
    Player plyrs[5];
    const std::string names[5] = {"Eric Gelinas","John Merill", "Jaromir Jagr", "Travis Zajac","Reid Boucher"};

    std::cout << "Is this the first time this program has run?" << std::endl;
    std::string firstTime;
    std::cin >> firstTime;

    if (firstTime == "Yes" || firstTime == "yes") {
        for (int i = 0; i != 5; ++i) {
            plyrs[i].setPlyrVal(rand_engine);
            plyrs[i].setPlayeName(names[i]);
        }
        std::ofstream playerSaveData;

        playerSaveData.open ("savedata.txt");

        for (const auto& plyr : plyrs) {
            playerSaveData << plyr.plName << "," << plyr.plOvr << "," << plyr.plSpg << "," << plyr.plSps << "\n";
        }
        std::cout << "done." << std::endl;
    }
    return 0;
}

Live example

【讨论】:

    【解决方案2】:

    你应该在整个程序中只调用一次srand(),而不是在每个rand()之前调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 2017-03-28
      • 2023-01-30
      • 2014-04-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      相关资源
      最近更新 更多