【问题标题】:how to reset rand() function c++如何重置rand()函数c ++
【发布时间】:2021-02-24 16:58:58
【问题描述】:

下午好。 我正在做一个包含四个按钮的测验。它们包含从文本文件中随机选择的文本行。当我使用 rand() 函数调用 4 个整数时,问题就开始了,该函数从 1-5。知道 rand() 函数可以选择相同的数字,我编写了以下代码:

if (random4 == random1 || random4 == random2 || random4 == random3) {
  if (random4 == 5) {
    while (random4 == random1 && random4 == random2 && random4 == random3 ||
           random4 != 5) {
      random4--;
    }
    return Button4Making();
  } else {
    while (random4 == random1 && random4 == random2 && random4 == random3) {
      random4++;
    }
    return Button4Making();
  }
}

但现在我的程序运行良好,但崩溃了很多时间。 我假设我需要设置一个限制或类似的东西,但我不知道该怎么做。

功能:

void game_frame::Button1Making() {
  srand(time(NULL));
  int bla = 0;

  string rading;

  ifstream object(
      "C:\\Users\\Dzemail\\OneDrive\\Desktop\\database\\odgovori.dat");

  while (bla != random1 && getline(object, rading)) {
    ++bla;
  }
  if (bla == random1) {
    button1 = new wxButton(main_panel1, wxID_ANY, rading, wxPoint(10, 10),
                           wxSize(150, 50));
  } else {
    button1 = new wxButton(main_panel1, wxID_ANY, "Error", wxPoint(10, 10),
                           wxSize(150, 50));
  }
}
void game_frame::Button2Making() {
  srand(time(NULL));
  int bla = 0;
  if (random2 == random3 || random2 == random4 || random2 == random1) {
    if (random2 == 5) {
      while (random2 == random1 && random2 == random4 && random2 == random3) {
        random2--;
      }
      return Button2Making();
    } else {
      while (random2 == random1 && random2 == random4 && random2 == random3 ||
             random2 != 5) {
        random2++;
      }
      return Button2Making();
    }
  } else {
    string rading;

    ifstream object(
        "C:\\Users\\Dzemail\\OneDrive\\Desktop\\database\\odgovori.dat");

    while (bla != random2 && getline(object, rading)) {
      ++bla;
    }
    if (bla == random2) {
      button2 = new wxButton(main_panel1, wxID_ANY, rading, wxPoint(200, 10),
                             wxSize(150, 50));
    } else {
      button2 = new wxButton(main_panel1, wxID_ANY, "Error", wxPoint(200, 10),
                             wxSize(150, 50));
    }
  }
}
void game_frame::Button3Making() {
  srand(time(NULL));
  int bla = 0;

  string rading;

  ifstream object(
      "C:\\Users\\Dzemail\\OneDrive\\Desktop\\database\\odgovori.dat");

  while (bla != random3 && getline(object, rading)) {
    ++bla;
  }
  if (bla == random3) {
    button3 = new wxButton(main_panel1, wxID_ANY, rading, wxPoint(400, 10),
                           wxSize(150, 50));
  } else {
    button3 = new wxButton(main_panel1, wxID_ANY, "Error", wxPoint(400, 10),
                           wxSize(150, 50));
  }
}
void game_frame::Button4Making() {
  srand(time(NULL));
  int bla = 0;
  if (random4 == random1 || random4 == random2 || random4 == random3) {
    if (random4 == 5) {
      while (random4 == random1 && random4 == random2 && random4 == random3 ||
             random4 != 5) {
        random4--;
      }
      return Button4Making();
    } else {
      while (random4 == random1 && random4 == random2 && random4 == random3) {
        random4++;
      }
      return Button4Making();
    }

  } else {
    string rading;

    ifstream object(
        "C:\\Users\\Dzemail\\OneDrive\\Desktop\\database\\odgovori.dat");

    while (bla != random4 && getline(object, rading)) {
      ++bla;
    }
    if (bla == random4) {
      button4 = new wxButton(main_panel1, wxID_ANY, rading, wxPoint(600, 10),
                             wxSize(150, 50));
    } else {
      button4 = new wxButton(main_panel1, wxID_ANY, "Error", wxPoint(600, 10),
                             wxSize(150, 50));
    }
  }
}

【问题讨论】:

  • 请发布minimal reproducible exampleyou should not be using rand,改用<random> 库,它甚至有std::random_shuffle,它完全符合您的要求。
  • 将问题中的所有相关信息作为文本发布。如果确实需要图像,请使用 stackoverflow 提供的图像存储,而不是外部服务。提供的图像不再存在。 (或者无法从我的目的地到达)

标签: c++ wxwidgets


【解决方案1】:

听起来您想要从列表中随机选择项目,但没有重复。一个简单的方法是打乱一个列表,然后从打乱的列表中读出项目。此页面描述了执行此操作的方法:https://www.cplusplus.com/forum/general/207328/

在您的情况下,您可以按 [1, 2, 3, 4] 之类的顺序创建一个包含整数的列表,然后将列表打乱,给您一些排列,例如[2、4、1、3]。这样可以确保您没有重复。

【讨论】:

  • 随机播放意味着其中一个数字永远不会出现。
  • @Tom 我想我会采用这个解决方案。谢谢!
  • @AyxanHaqverdili — 改组只会改变元素的顺序。它不会删除任何一个。
  • @PeteBecker OP 想要 [1-5] 范围内的 4 个元素,但此答案仅生成 [1-4] 范围内的数字。解决此问题的一种方法是将所有五个数字相加,将其随机排列并取前 4 个。只要您想要的样本数与可能的范围相似,这很好。如果范围是 [1-1,000,000,000] 并且 OP 想要该范围内的 4 个随机数,那么将 10 亿个元素改组以获得 4 个数字将是疯狂的。
  • @AyxanHaqverdili -- 问题在于随机选择 四个 按钮。我怀疑生成 [1-5] 是试图通过蛮力生成四个值的人工制品。
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 2012-08-20
  • 2019-02-25
  • 2023-02-24
  • 1970-01-01
相关资源
最近更新 更多