【发布时间】:2018-09-19 18:35:15
【问题描述】:
我正在寻找用 C++ 编写一个名为 Farkle 的小骰子游戏(你可能从 Kingdom come delivarance 知道它),但我还在学习,所以我遇到了一些麻烦。 atm 我正在尝试掷 6 个骰子并将每个掷出的数字放入一个数组中,以便之后能够使用它。一切似乎都正常,但 Visual Studio 正在输出此错误代码:
运行时检查失败 #2 - 变量“die”周围的堆栈已损坏。
这是我的代码:
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void dice() {
int die[5];
int i = 1;
while (i <= 6) {
die[i] = rand() % 6 + 1;
cout << die[i];
i++;
}
}
int main()
{
srand(time(NULL));
dice();
system("STOP");
return 0;
}
这实际上是这种程序的正确方法吗?
【问题讨论】:
-
int die[5].您认为您可以访问哪些索引? -
大小为 N 的数组的索引从 0 到 N-1,如果 int die[N] 则循环将是 (for int i = 0; i
-
您正在使用模数 (
%) 引入偏差。最好使用std::uniform_int_distribition。还;rand()生成质量很差的随机数,更好的选择是std::mt19937,至于播种,最好使用std::random_device。 -
虽然@ArkadyGodlin 只是为了解释,但在给定的情况下,您实际上应该更喜欢 for 循环,原因如下:1.
i的范围仅限于循环体(因为您不需要它之后无论如何)2.更紧凑,条件检查和值修改紧密结合在一起,因此您可以获得更好的可读性。