Modulo给出了不可能的价值

时间:2013-01-30 20:36:46

标签: c++ modulo

我想要一个介于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;
    }
    
  5. 我得到的一些价值观:

    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 个答案:

答案 0 :(得分:9)

比较这些界限:

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

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

再次尝试你的程序,但是:

int Fasit[4];

答案 1 :(得分:2)

你在Fasit中只有3个元素[3];当你写信给Fasit [3]时,你处于未定义行为的范畴,在这种情况下,它表现为自我与明显的矛盾。

答案 2 :(得分:2)

int Fasit[3];

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

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

答案 3 :(得分:2)

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

访问Fasit[3]用于读取和写入,是未定义的行为。您的代码是写{读到Fasit[3] :-)。该程序正在访问数组越界。修复它!

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

另见: