模数给出了不可能的价值

Modulo gives impossible value

本文关键字:不可能      更新时间:2023-10-16

我想要一个包含 1 到 6 之间的四个值的表。

我正在使用:rand() % 6 + 1;

这应该给出 1 到 6 之间的值。

除非rand()生成值 0。

  1. 我一直得到7。我不想要任何 7

  2. 兰特的范围是多少?如何防止它生成任何 0 值?

  3. 替代解决方案非常受欢迎。

  4. 我的老师给了我们使用"随机"的线索。
    我们在学校使用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],它有一个不确定的行为。当一种行为没有定义时,你一定会得到奇怪的结果。就是这样。