繁体   English   中英

模数赋予不可能的价值

[英]Modulo gives impossible value

我想要一个介于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:我知道我的印刷品是拳头状的,一旦生成数字,我将使其更加优雅。

请考虑以下几行:

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

您声明一个由三个条目组成的数组,您将其写入四次

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

int Fasit[4];

Fasit [3]中只有3个元素; 当您写给Fasit [3]时,您处于未定义行为的境界,在这种情况下,这表现为具有明显矛盾的自我。

int Fasit[3];

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

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

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

访问Fasit[3]用于读取和写入)是未定义的行为 您的代码是对Fasit[3] :-)的读写。 程序正在越界访问阵列。 修理它!

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

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM