我正在用C ++编写一个名为Farkle的小骰子游戏(你可能从王国传来这个游戏),但我还在学习,所以我遇到了一些麻烦。 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;
}
这种程序实际上是正确的方法吗?
答案 0 :(得分:6)
不,生成均匀分布的随机数的更好方法是
#include <random>
#include <algorithm>
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
std::uniform_int_distribution<> d6(1, 6); // {1, 2, 3, 4, 5, 6} with equal probability
int die[5];
std::generate(die, die + 5, [&gen, &d6](){ return d6(gen); });
如果您生成多组5d6,则可以重复使用相同的gen
,而不是每次重新初始化
答案 1 :(得分:3)
正如其他人指出的那样。您的错误源于使用太小的数组。这篇文章将更多地关注您的代码更像是C。
使用std::array
而不是原始数组在C ++中更惯用。
此外,建议不要使用rand()
,因为它会产生错误的随机数,并且通过使用模运算,您会向随机数引入额外的偏差。相反,应该使用<random>
标题中的类。
为了使代码更具可读性,您可以尝试使用<algorithm>
中的函数来替换命名算法的循环。
这导致以下代码:
#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <random>
void dice() {
std::array<int, 6> die;
std::mt19937 gen{std::random_device{}()};
std::uniform_int_distribution<int> dice_roll{1, 6};
std::generate(begin(die), end(die), [&] { return dice_roll(gen); });
std::copy(begin(die), end(die), std::ostream_iterator<int>{std::cout});
}
int main() {
dice();
std::cin.get();
}
答案 2 :(得分:2)
您的代码中有2个问题:
您的数组大小为5,但您可以访问6个索引(1到6),您可以通过在条件中将<=
更改为<
来避免这种情况。
C ++中数组的索引从0开始,但是从1开始。如果您在代码中将每个die[i]
更改为die[i-1]
,则可以解决这个问题。
另一种方法(修复这两个问题)是初始化i=0
并使用while (i < 5)
答案 3 :(得分:0)
索引i
应该是0
到5
,而不是1
到6
。
很明显,当i = 6
时,它会超出导致错误的dice
范围。
编辑以下行:
int i = 0;
while (i <= 5) {
....
答案 4 :(得分:-2)
试试这段代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
void populateArray( int ar[], /*const*/ int n )
{
for( int i = 0 ; i < n ; ++i ) ar[i] = std::rand() % 50 + 1 ;
}
int main()
{
// http://en.cppreference.com/w/cpp/numeric/random/srand
std::srand( std::time(nullptr) ) ; // **** important ****
const int ARRAY_SIZE = 50;
int ar[ARRAY_SIZE] = {0} ;
populateArray( ar, ARRAY_SIZE ) ;
for( int v : ar ) std::cout << v << ' ' ;
}