C 使用3个字符生成200个唯一的40个字符字符串
我希望仅使用“a”、“b”或“c”生成至少200个唯一的40个字符的字符串。例如,一个好的字符串应该是“aaaa…aaaa”(40个字符)。以下是我目前的做法:C 使用3个字符生成200个唯一的40个字符字符串,c,string,char,unique,C,String,Char,Unique,我希望仅使用“a”、“b”或“c”生成至少200个唯一的40个字符的字符串。例如,一个好的字符串应该是“aaaa…aaaa”(40个字符)。以下是我目前的做法: charnewid[41]; sprintf(newid,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
charnewid[41];
sprintf(newid,“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa代码>
另一种方法:
char newid[41];
char* pad[41] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
sprintf(newid, "%s%s\n", pad+4, "bbbb");
但我仍然不知道如何进行循环,使流程自动化。。。(对不起,我是C区的noob)。请帮忙;任何提示或方法都将不胜感激!谢谢大家! 2^64>3^40所以只需在12157665459056928801
下面选择200个(不同的)随机64位数字,并转换为基数3(使用a
、b
和c
“数字”,而不是通常的0
、1
和2
)。使用伪随机数生成器在“a”之间随机选择,“b”和“c”。要强制唯一性,请跟踪以前生成的newid
值并丢弃重复项
#include <stdlib.h>
#include <string.h>
void generate() {
char previous[199][40+1];
char newid[40+1];
int i, j, unique;
srand(time(NULL));
newid[40] = '\0';
for(i=0; i < 200; i++) {
for(j=0; j < 40; j++) {
newid[j] = 'a' + (rand() % 3);
}
/* confirm newid is 'unique' */
unique=1;
for(j=0; unique && j < i; j++) {
if (strcmp(previous[j], newid) == 0)
unique=0;
}
if (!unique) {
/* discard duplicate */
i--;
continue;
}
/* save newly genererated unique value */
strcpy(previous[i], newid);
printf("%s\n", newid);
}
}
#包括
#包括
void生成(){
char-previous[199][40+1];
char-newid[40+1];
int i,j,唯一;
srand(时间(空));
newid[40]='\0';
对于(i=0;i<200;i++){
对于(j=0;j<40;j++){
newid[j]=“a”+(rand()%3);
}
/*确认newid是“唯一的”*/
唯一=1;
对于(j=0;唯一&&j字符板[40]代码>有足够的空间容纳39个字符长的字符串。哦,是的,我忘记了空字符。谢谢复制品的几率是否足够大,以保证对其唯一性进行检查?为什么要将其随机化?从0开始,数到199。@Jongware:哈哈,你说得对!将“different”改为斜体和括号内,我知道数字在C中存储为二进制,但如何将数字从0-199转换为“a”、“b”和“C”?我可以从二进制转换为基数3,但我不知道如何从基数3转换为字符“数字”?很抱歉,这会让人困惑……如果您可以生成一个base-3字符串,那么只需将0
更改为a
,1
更改为b
,2
更改为c
(实际上,确切的顺序并不重要……)@pmg没有提到结果base-3字符串可能少于200个字符——前导零会自动删除——因此请确保填充字符串。+1感谢您提供此解决方案!看到另一个实现非常酷。很遗憾,我无法在此文件中使用rand()。如果您不介意我问一下,当您这样做时会发生什么(rand()%3)?我不知道我们可以修改字符。(rand()%3)
将返回一个介于0和2之间的随机数,将ascii值“a”相加,从而在“a”、“b”和“c”之间产生一个随机字符。为什么不能使用rand()?为了确保在笨拙的字符集中正常工作,请使用“abc”[rand()%3]
哦,这很聪明!但是,如果字符不是方便的“a”、“b”或“c”(例如“a”和“x”),会发生什么呢?我正在处理的文件没有std库,我无法修改该部分:(我从未遇到过不提供PRNG(伪随机数生成)功能的平台。无论您是为哪个平台编程,请检查api/sdk以获得适当的替换。其次,如果您希望更改有效字符的域,请将它们放入数组中,并将随机数作为此数组的下标。