我想知道是否有一种方法可以从C中的以下数组中随机挑选一个字符,但只挑选每个字符一次....
const char characters[13][4] =
{ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' ,
'J' , 'K' , 'L' ,'M' , 'N' , 'O' , 'P' , 'Q' , 'R' ,
'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y', 'Z',
'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' ,
'J' , 'K' , 'L' , 'M' , 'N' ,'O' , 'P' , 'Q' , 'R' ,
'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y', 'Z'
};
答案 0 :(得分:3)
当您选择一个角色时,只需将其从集合中删除:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
char getRandomChar(char *set) {
size_t len = strlen(set);
if (len == 0) {
/* We are all out of characters */
return -1;
}
/* Select a character at random */
int rv = rand() % len;
char ret = set[rv];
/* Remove the selected character from the set */
set[rv] = set[len -1];
set[len -1] = '\0';
/* Return the character */
return ret;
}
int main(void) {
char set[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char randomChar;
/* Intialize random number generator */
srand((unsigned)time(NULL));
while ((randomChar = getRandomChar(set)) != -1) {
printf("Selected %c. Remaining: %s\n", randomChar, set);
}
return 0;
}
请注意,代码可以处理多次出现相同字符的情况。如果您希望每个字符都被绘制两次,请使用起始集"AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ"
。
答案 1 :(得分:0)
如果您可以修改字符,然后随机选择一个字符,如果它不是零(或某事),那么您拥有该字符并获得它并将条目设置为零(或某事)。如果它为零(或某事),则循环并选择另一个字符。
如果您无法修改原始字符,请使用另一个&#34;数组&#34;如果某个字符被选中,则包含一个布尔值。它应该镜像characters
数组的维度,并检查是否已经选择了一个字符。