模数给出了不可能的价值
Modulo gives impossible value
本文关键字:不可能 更新时间:2023-10-16
我想要一个包含 1 到 6 之间的四个值的表。
我正在使用:rand() % 6 + 1;
这应该给出 1 到 6 之间的值。
除非rand()
生成值 0。
-
我一直得到7。我不想要任何 7
-
兰特的范围是多少?如何防止它生成任何 0 值?
-
替代解决方案非常受欢迎。
-
我的老师给了我们使用"随机"的线索。
我们在学校使用Borland C++ Builder 5。
我在家里使用 Dev-C++ 5.3.0.3。
我发现它们的工作方式存在一些差异,我觉得很奇怪。
我不能使用 random(),它给了我没有在范围内声明......int main (){ int I; int Fasit[3]; srand (time(NULL) ); for(I=0; I<4; I++) { Fasit[I]=rand() % 6 + 1; } std::cout << Fasit[0] << " " << Fasit[1] << " " << Fasit[2] << " " << Fasit[3] << " "; return 0; }
我得到的一些值:
2 6 1 7
5 2 1 4
5 2 1 4
5 2 1 4
1 3 1 6
5 3 3 7
5 3 3 7
5 3 3 7
7 应该不可能,不是吗?
PS:我知道我的印刷品是笨拙的拳头,一旦数字生成工作,我会让它更优雅一点。
Consdier 这些行:
int Fasit[3];
for(I=0; I<4; I++) {
Fasit[I]
你声明一个包含三个条目的数组,你写四次。
再次尝试您的程序,但使用以下方法:
int Fasit[4];
Fasit[3]中只有3个元素;当你写信给Fasit[3]时,你处于未定义行为的领域,在这种情况下,它以明显的矛盾表现出来。
Fasit[3]
只允许您访问Fasit[0]
、Fasit[1]
和Fasit[2]
。
访问Fasit[3]
,无论是用于读取还是写入,都是未定义的行为。您的代码正在写入和读取Fasit[3]
:-)。程序正在越界访问阵列。修复它!
至于为什么要打印7,那只是巧合。请注意,Fasit[0-3]
始终按预期打印在1-6
范围内。
另请参阅:
数组索引在 C 中越界
边界检查
int Fasit[3];
您正在创建一个大小为 3 的数组,只能使用索引 0、1 或 2 访问该数组。
你正在写作和阅读Fasit[3],它有一个不确定的行为。当一种行为没有定义时,你一定会得到奇怪的结果。就是这样。
相关文章:
- C# HashSet VS C++ std::unordered_set 使用自定义类键。C++慢...不可能。如何实现 C# 的速度?
- 为什么在C++不可能递增或进行数学运算,例如在声明为数组的变量上乘法
- fopen 与常量字符 * 从 QString 是不可能的
- 矢量返回常量引用,不可能向下转换
- 分配取消引用的字符指针真的不可能吗?
- C#类过程 - 控制C 应用程序,不可能读取输出
- 可能是不可能的模板参数规范/推论
- 易失性结构 = 结构不可能,为什么?
- 矢量超出范围,将值分配给空矢量>不可能?
- 为什么不可能实例化原子对
- 一个倒梯形,但如果输入高度对于宽度来说太大,那么它应该报告,不可能("不可能的形状"是什么)
- W10上不可能使用十字架编译的libpng16-16.dll执行
- 如果明确给出多维数组,为什么不可能char [] [] [] = {..},{..}}
- 为什么我的自定义界面总是返回不可能的0x80040213/VFW_E_NO_CLOCK
- 从张量的读取设备不可能的方法
- 多态性抽象语法树(递归下降解析器):不可能
- IDXGISwapChain::CheckInterfaceSupport 返回一个不可能的结果
- C++为什么不可能将这两个操作合并在一行中?
- 指针将指针的指针等同于指针指向指针.不可能
- 是std :: set&lt; std :: future&gt;不可能存在