生成随机数并将它们放在一个数组中

时间:2018-04-10 08:12:13

标签: c++ arrays random dice

我正在用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;
}

这种程序实际上是正确的方法吗?

5 个答案:

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

  1. 您的数组大小为5,但您可以访问6个索引(1到6),您可以通过在条件中将<=更改为<来避免这种情况。

  2. C ++中数组的索引从0开始,但是从1开始。如果您在代码中将每个die[i]更改为die[i-1],则可以解决这个问题。

  3. 另一种方法(修复这两个问题)是初始化i=0并使用while (i < 5)

答案 3 :(得分:0)

索引i应该是05,而不是16。 很明显,当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 << ' ' ;
}