将字母随机放入C ++中的数组

时间:2019-02-21 15:46:49

标签: c++ srand

我正在用C ++创建一个战舰游戏,但在弄清楚如何将1x3船只随机水平放置在我的板上时遇到了麻烦。我拿了一块10x10的木板,上面装满了“ O”(代表“海洋”),我试图弄清楚如何随机放置一个甚至只有1x1的“ S”(代表船)。

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    const int rows=10;
    const int cols=10;
    srand(time(NULL));

    char board[100];

    ifstream fin;
    fin.open("board.txt");
    for (int i=0; i<rows*cols; i++) fin >> board[i];
    fin.close();

    for (int r=0;r<rows;r++) {
        for (int c=0;c<cols;c++) {
            cout << board[r*rows+c] << " ";
       }
       cout << endl;
     }
}

我的“ board.txt”是保存10x10木板的文件。我特别在寻找如何在板上随机放置1个字母“ S”的方法,这样我便可以自己弄清楚如何将“ S S S”水平放置在阵列中的某个位置。

请记住,我正在学习C ++的大学课程,所以我在这方面还很新,所以不要讨厌。

1 个答案:

答案 0 :(得分:0)

由于矩阵为10 x 10,因此要将S放置在某个地方,只需生成0到99之间的随机数并将其用作索引即可。

您可以使用uniform_int_distribution和为此使用LCG 1 minstd_rand

#include <iostream>
#include <fstream>
#include <random>
using namespace std;

int main() {
    const int rows = 10;
    const int cols = 10;
    uniform_int_distribution<int> dist(0, rows * cols - 1);
    random_device rnd_seed;
    minstd_rand rnd_gen { rnd_seed() };

    char board[100]{};

    ifstream fin;
    fin.open("board.txt");
    for (int i = 0; i < rows*cols; i++) fin >> board[i];
    fin.close();

    board[dist(rnd_gen)] = 'S'; // place S at a random location

    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            cout << board[r*rows + c] << " ";
        }
        cout << endl;
    }
}

1 LCG非常快,但可以预测。对于游戏,您可能需要研究mt19937之类的PRNG(速度较慢,但​​可预测性较差),或者是真正的RNG,random_device(速度最慢)。

另请参阅this explanation,为什么将srand / rand()视为有害。