gpt4 book ai didi

c++ - 确定性 C++ 程序的 "Random"输出。可能的原因?

转载 作者:行者123 更新时间:2023-11-28 05:52:58 24 4
gpt4 key购买 nike

我在 64 位 Windows PC 上使用 Microsoft Visual Studio Community 2015,版本 14.xxx。

程序读取一个文本文件,其中每一行都是桥牌(四名玩家,每人有 13 张牌)。该文件由可靠的第 3 方程序生成,但我还是验证了每笔交易,并且每个输入行都通过了验证。

然后,我根据点数、花色长度等变量将“相似”交易分组到类(容器)中。这是使用字符串流和 Bin 结构映射的标准文本处理。对于给定的输入文件,它是完全确定的。

大约 3/4 的时间我得到相同的输出,例如23 个可能的 bins - 如预期的那样,跨 bins 的交易频率加起来就是输入交易的数量。但是剩余的输出可能有 6 到 50 个 bin(具有正确的频率总数)。

这种随机性可能出现在哪里?我使用所有变量的默认初始化,因此,即使这是错误的,它也应该在给定文件上运行的程序之间保持一致。例如,

std::string line;  //  Raw data on a deal.
std::vector<std::string> parsed_deal;
std::map<std::string, struct Bin> m_bin;
std::stringstream ss_bin[MAX_BINS];

最佳答案

默认初始化并不意味着每次运行程序时所有变量都将以完全相同的方式初始化。特别是,默认初始化意味着在几种情况下未初始化。示例包括未初始化的基本类型(intfloat、指针、它们的数组等)(例如 auto 未初始化为零的变量), 以及实际上没有被构造函数初始化的类类型的成员。访问未初始化变量的值(如果它是指针,更不用说取消引用了)会产生未定义的行为。

当然,还有其他未定义行为的原因(从数组的末尾掉下来,骚扰指针,对同一指针调用运算符 delete 两次,调用运算符 deletemalloc() 返回的指针上。

如果行为未定义,则“非确定性”行为是一种可能的结果。例如,当一个变量被定义但没有被初始化时,它的值可能基于之前发生在那个物理/逻辑内存位置的任何东西。因此访问它的值的结果将取决于之前有哪些其他代码(在您的程序中,在您的操作系统中,甚至在另一个进程中)使用该内存,以及该内存在您的程序访问它之前如何/是否被覆盖。

关于c++ - 确定性 C++ 程序的 "Random"输出。可能的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com