从字符数组中选择随机字符?

时间:2019-10-06 23:52:25

标签: c++ arrays random boggle

我是C ++的新手,本周的任务很艰巨。由于不想为我完成任何工作,因此我不会赘述太多,但是有人能指出我如何从多维字符串数组中选择随机字符的正确方向吗?

char gameZero[16][6] = { {'A','A','C','I','O','T'}, {'A','H','M','O','R','S'}, {'E','G','K','L','U','Y'}, {'A','B','I','L','T','Y'}, {'A','C','D','E','M','P'}, {'E','G','I','N','T','V'}, {'G','I','L','R','U','W'}, {'E','L','P','S','T','U'}, {'D','E','N','O','S','W'}, {'A','C','E','L','R','S'}, {'A','B','J','M','O','Q'}, {'E','E','F','H','I','Y'}, {'E','H','I','N','P','S'}, {'D','K','N','O','T','U'}, {'A','D','E','N','V','Z'}, {'B','I','F','O','R','X'} };

目标是打印出一个包含这些角色的4x4棋盘,在每局游戏开始时从每个阵列中挑选一个随机角色,因此不会有一个棋盘是相同的。

任何有关此操作的建议/技巧都将不胜感激-谢谢!

编辑:

我已经到了可以从两个数组生成随机索引的地步,但是我目前的做法是只输出一个字符,而我需要从数组16个分类中的每个字符中提取一个char。关于如何从每个输出一个的任何想法?我以为我必须将索引生成器放在某种循环中。

mt19937 gen(time(nullptr)); // random number generator

// used to generate random number in specific range 
uniform_int_distribution<int> random_outer(0, outer_size - 1);
uniform_int_distribution<int> random_inner(0, inner_size - 1);

int index_outer = random_outer(gen); // used to generate random outer index
int index_inner = random_inner(gen); // used to generate random inner index

cout << gameZero[index_outer][index_inner] << endl;

4 个答案:

答案 0 :(得分:2)

您可以使用以下算法:

  • 在间隔[0, std::size(gameZero )[中生成随机数x
  • 在间隔[0, std::size(gameZero[0])[中生成随机数y
  • 访问gameZero[x][y]以获得2D数组的随机字符。

答案 1 :(得分:0)

  • 提供一个包含6个项目的int列表。
  • 使用0到5的索引值对其进行初始化。
  • 对于板中的每个单元://from 0 - 15.
    • 随机排列int列表。
    • 每拥有4x4电路板://假设最多为6。
      • 使用索引iBoard中的int列表中的项目设置当前板的当前单元格。
        • //example: board[iBoard][iCell] = listInt[iBoard]

答案 2 :(得分:0)

鉴于您的gameZero类型为char[16][6],您只需生成一个随机数,该随机数表示距gameZero的起始偏移量,范围为(0, sizeof gameZero)。保证任何基本类型(char, int, double, etc...)的数组在内存中都是顺序的。此外,在您使用char类型的情况下,每个char都是1字节。因此,您可以通过计算与数组开头的偏移量来访问gameZero中的任何字符。

如您所见,C ++提供了自己的Pseudo-random number generation。您可以选择任一分发引擎来创建随机分发。当您需要使用通过引擎的分发进行呼叫时需要一个随机数时,您已经创建了一个实例作为其参数。例如,要使用std::mersenne_twister_engine创建随机分布,您可以执行以下操作:

#include <random>
...
    char gameZero[16][6] = {{'A','A','C','I','O','T'}, 
    ...
    std::random_device rd;              /* random device/seed */
    std::mt19937 gen(rd());             /* standard mersenne_twister_engine */
    std::uniform_int_distribution<> dist(0, sizeof gameZero);    /* dist */

然后,为了选择表示gameZero内偏移量的随机元素,您只需使用以下命令即可请求一个随机数:

        int off = dist(gen);        /* get random offset in gameZero */

根据偏移量,[x][y]中的gameZero元素可以简单地通过使用数组中的列数(在您的情况下为6)来计算,例如

        int x = off / 6,            /* compute row from offset */
            y = off - 6 * x;        /* compute col from offset */

注意整数除法专门用于计算上面的x(行)值)

然后您可以简单地使用gameZero[x][y]访问随机元素。

例如,如果在循环中您请求一个随机偏移量并如上所述计算[x][y]索引,则可以输出偏移量,计算出的索引以及该索引处的字符,类似于以下内容:

$ ./bin/randarr2d
92 - gameZero[15][2] = F
 9 - gameZero[ 1][3] = O
14 - gameZero[ 2][2] = K
91 - gameZero[15][1] = I
86 - gameZero[14][2] = E
46 - gameZero[ 7][4] = T
92 - gameZero[15][2] = F
33 - gameZero[ 5][3] = N
87 - gameZero[14][3] = N
57 - gameZero[ 9][3] = L
87 - gameZero[14][3] = N
50 - gameZero[ 8][2] = N
10 - gameZero[ 1][4] = R
23 - gameZero[ 3][5] = Y
...

理解,您也可以直接使用偏移量直接访问元素,但是这会导致技术上违反数组范围。 (例如*(*gameZero + off))。短故事是2D数组,实际上是1D数组的数组。当您访问数组时,它将转换为指向其第一个元素的指针。对于2D数组,它是指向第一个 array 的指针。 (您的情况下为第一个6个字符的数组),因此,如果您应用的偏移量大于5,则即使您仍在2D数组的边界内,从技术上讲,该元素的地址也位于第一个1D数组的边界之外。从单个偏移量计算x, y索引可以消除该问题。

仔细检查一下,如果还有其他问题,请告诉我。

答案 3 :(得分:0)

感谢所有对此主题做出回应的人的帮助,我相信我已经对我的问题找到了合理的答案。如果有人碰巧遇到了这个线程,这就是我想出的:

void shuffleDice() { // shuffles Game #0 dice. 

mt19937 gen(time(nullptr));
uniform_int_distribution<int> random_inner(0, inner_size - 1);

int n = random_inner(gen); // generates random number for inner array 
for (int i = 0; i < 16; i++) // loops through outer array
{
    cout << gameZero[i][n] << '\n';
}

请记住,我是编程/ C ++的新手,所以它可能不是最漂亮的,但是它仍然可以工作。