1

我想要一个包含 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:我知道我的打印是火腿,一旦数字生成工作,我会让它更优雅一点。

4

4 回答 4

9

考虑这些行:

int Fasit[3];
for(I=0; I<4; I++) {
  Fasit[I]

您声明了一个包含三个条目的数组,您将其写入四次

再次尝试您的程序,但使用:

int Fasit[4];
于 2013-01-30T20:39:02.100 回答
2

Fasit[3] 中只有 3 个元素;当您写信给 Fasit[3] 时,您处于未定义行为的领域,在这种情况下,它以明显的矛盾表现出来。

于 2013-01-30T20:40:15.007 回答
2
int Fasit[3];

您正在创建一个大小为 3 的数组,只能使用索引 0、1 或 2 访问该数组。

您正在编写和阅读 Fasit[3],它具有未定义的行为。当行为未定义时,您一定会得到奇怪的结果。就是这个。

于 2013-01-30T20:41:57.297 回答
2

Fasit[3]只允许您访问Fasit[0]Fasit[1]Fasit[2]

访问Fasit[3]无论是读还是写,都是未定义的行为。您的代码正在写入和读取Fasit[3]:-)。程序正在越界访问数组。修理它!

至于为什么要打印 7,那只是巧合。请注意,Fasit[0-3]始终1-6如您预期的那样在范围内打印。

也可以看看:

于 2013-01-30T20:43:54.490 回答