我是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;
您可以使用以下算法:
[0, std::size(gameZero )[
中生成随机数x[0, std::size(gameZero[0])[
中生成随机数ygameZero[x][y]
以获取2D数组的随机字符。//from 0 - 15.
//example: board[iBoard][iCell] = listInt[iBoard]
鉴于类型为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 */
((note: integer除法故意用于计算上面的x
(行)值)] >>
然后您可以简单地使用gameZero[x][y]
访问随机元素。
例如,如果在循环中您请求一个随机偏移并如上所述计算[x][y]
索引,则可以输出偏移,计算的索引和该索引处的字符,类似于以下内容:
。当您访问数组时,它将转换为指向其第一个元素的指针。对于2D数组,它是第一个array的指针。 (您的情况下为第一个6个字符的数组),因此,如果您应用的偏移量大于5,则即使您仍在2D数组的边界内,从技术上讲,该元素的地址也位于第一个1D数组的边界之外。从单个偏移量计算$ ./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数组的数组
x, y
索引可消除该问题。仔细检查,如果还有其他问题,请通知我。
感谢所有对此话题做出回应的人的帮助,我相信我已经为我的问题找到了合理的答案。如果有人碰巧遇到了这个线程,这就是我想出的: