在C语言中生成唯一字符数组
我试图生成一个由10个随机但唯一的字符组成的数组。有时,当我运行代码时,字符不是唯一的 我将感谢任何帮助。多谢各位在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] =
#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”了解更多细节。