[英]Modulo gives impossible value
我想要一个介于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:我知道我的印刷品是拳头状的,一旦生成数字,我将使其更加优雅。
请考虑以下几行:
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.