在C语言中生成唯一字符数组

在C语言中生成唯一字符数组,c,random,unique,C,Random,Unique,我试图生成一个由10个随机但唯一的字符组成的数组。有时,当我运行代码时,字符不是唯一的 我将感谢任何帮助。多谢各位 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); char letters[10]; for (int i = 0; i < 10; i++) { letters[i] =

我试图生成一个由10个随机但唯一的字符组成的数组。有时,当我运行代码时,字符不是唯一的

我将感谢任何帮助。多谢各位

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    char letters[10];
    for (int i = 0; i < 10; i++) {
        letters[i] = 97 + rand() % (122-97);
        for (int j = 1; j < i; j++) {
            if (letters[i]==letters[j]) {
                letters[i] = 97 + rand() % (122-97); // continue
            }
        }
        printf("%c\n", letters[i]);
    }
}
#包括
#包括
#包括
int main(){
srand(时间(空));
字符[10];
对于(int i=0;i<10;i++){
字母[i]=97+rand()%(122-97);
对于(int j=1;j
仅当刚生成的字符与数组中的前导字符不同时,代码才会进行检查;您应该尝试使用这样的标志:

srand(time(NULL));
char letters[10];
int is_unique = 1, i=0,j ;
while (i<10){
    is_unique = true;
    letters[i] = 'a' + rand() % 26;
    for(j=0;j<i;j++){
        if (letters[i]==letters[j])
            is_unique = false;
    }
        if (is_unique)
            i++;
}

仅当刚刚生成的字符与数组中的前导字符不同时,代码才会进行检查;您应该尝试使用这样的标志:

srand(time(NULL));
char letters[10];
int is_unique = 1, i=0,j ;
while (i<10){
    is_unique = true;
    letters[i] = 'a' + rand() % 26;
    for(j=0;j<i;j++){
        if (letters[i]==letters[j])
            is_unique = false;
    }
        if (is_unique)
            i++;
}

问题是随机数可以给出相同的数字。它不知道你每次都想要不同的号码

这就是解决这个问题的方法,我告诉你方法,你需要编程

确定参与的角色,然后创建一个包含这些角色的数组

然后掷骰子给出数组范围内的数字。得到的数字是数组的索引,然后获取该索引中的字符

然后将数组中的最后一个字符放入索引中,下次掷骰子时,将最大数量限制为数组原始大小的一个以下

继续此算法,直到获得所需的所有字符数


此算法可确保获得不同的字符。

问题在于随机数可以给出相同的数字。它不知道你每次都想要不同的号码

这就是解决这个问题的方法,我告诉你方法,你需要编程

确定参与的角色,然后创建一个包含这些角色的数组

然后掷骰子给出数组范围内的数字。得到的数字是数组的索引,然后获取该索引中的字符

然后将数组中的最后一个字符放入索引中,下次掷骰子时,将最大数量限制为数组原始大小的一个以下

继续此算法,直到获得所需的所有字符数


此算法确保您获得不同的字符。

您的错误是什么?不要使用“幻数”,而不是
97
编写
'a'
等。顺便说一句,请编辑您的问题,并告诉我们实际输出和预期输出。编译时,我使用相同的字符,例如b、a、c、g、a、c、b、k、y,你看有两个“a”字,第一个
intj=1
必须是
intj=0
。第二,当您尝试替换副本时,您只尝试一次。替换件可能再次重复。如果,你需要一个
,而不是
。谢谢你,我现在正在尝试,你的错误是什么?不要使用“幻数”,而不是
97
'a'
等等。顺便说一句,请编辑你的问题,告诉我们实际和预期的输出。编译时,我使用相同的字符,例如b,a,c,g,a,c,b,k,y,你看有两个“a”字,第一个
intj=1
必须是
intj=0
。第二,当您尝试替换副本时,您只尝试一次。替换件可能再次重复。如果
,你需要一个
,而不是
。谢谢你,我现在正在尝试,不要使用26,使用
('a'-'a')
(出于同样的原因)。是的,只是编辑了我的帖子;这样读代码要好得多,这是一个好习惯。这些代码没有正确运行,同样它给出了相同的字符。在第二种共享方式中,while循环无法检查0。和1。arraysorry索引我在回答时没有给予足够的注意,我更正了它们,所以它应该可以完成这项工作now@DYZ为什么用
('a'-'a')
表示26?ASCII
('a'-'a')
为32。如果有的话,
('z'-'a'+1)
是有价值的。不要使用26,使用
('a'-'a')
(出于同样的原因)。是的,只是编辑了我的帖子;这样读代码要好得多,这是一个好习惯。这些代码没有正确运行,同样它给出了相同的字符。在第二种共享方式中,while循环无法检查0。和1。arraysorry索引我在回答时没有给予足够的注意,我更正了它们,所以它应该可以完成这项工作now@DYZ为什么用
('a'-'a')
表示26?ASCII
('a'-'a')
为32。如果有的话,
('z'-'a'+1)
是有价值的。谷歌“Fisher-Yates shuffle”了解更多细节。谷歌“Fisher-Yates shuffle”了解更多细节。