【问题标题】:Behaviour different when debugging调试时的行为不同
【发布时间】:2015-11-16 22:27:23
【问题描述】:

我正在创建一个带有类的井字游戏,在学校使用 C++。

Part2 要求我实现单人模式(我对电脑)。

我有一个 3x3 矩阵,随机插入坐标(CPU 移动)的函数总是在主对角线 (1,1;2,2;3,3) 中播放。

如果我在调用“随机”方法并逐步调试时放置断点,它会创建除主对角线之外的其他坐标(这很好)。

我不明白为什么它只有在我逐步调试时才有效。

这是随机方法:

void Ponto::aleatorio() {
    srand(GetTickCount());
    x = (rand() % 3)+1;

    srand(GetTickCount());
    y = (rand() % 3)+1;
}

【问题讨论】:

  • 只调用一次srand(GetTickCount());(例如,从main(),不是每次调用您的函数时。
  • 真的吗?谢谢。太棒了,而且有点令人沮丧,一行代码如何破坏我的程序。即使我的老师也看不到问题。非常感谢。我只是删除了额外的 srand(GetTickCount());第 y 行 = (rand() % 3)+1;
  • @Ferro 并不是你在aleatorio 中有两次调用srand,而是你连续多次调用aleatorio
  • “随机”不是随机的,它是“伪随机”。不要设置srand 两次,只设置一次。在每次调用rand() 时,您肯定会得到一个新值。或者最终相同,但肯定会更加随机。

标签: c++ random


【解决方案1】:

当用一个值调用 srand 时,这个值被用作启动随机数生成器的种子。生成具有相同种子的随机数将生成相同的序列。由于您使用 GetTickCount() 为生成器播种,因此程序在下一个时钟滴答之前运行,因此始终使用相同的参数调用 srand。就像@πάντα ῥεῖ 所说,用 GetTickCount() 调用一次,然后不带 args 调用它以获取随机序列中的下一个数字。

【讨论】:

  • 这不是“总是用相同的参数调用 srand”,而是“可能”或“最有可能”。滴答计数可能在两个 GetTickCount() 调用之间发生变化 - 尽管在这个简单的情况下它更有可能保持不变。
  • 是的,正确,但如果不在调试器中运行时数字相同,则时钟滴答在调用之间不会发生变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2023-03-10
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多