从数组中选择一个随机字符

时间:2016-12-16 13:48:23

标签: c

我想知道是否有一种方法可以从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'

                    };

2 个答案:

答案 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数组的维度,并检查是否已经选择了一个字符。