这是我的代码。我正在尝试生成随机字母,但我看到相同的字母。 例如:( Y HTGDHFBSHXCHF Y FUXZWDYKLXI)我该如何解决?只是我需要混合字母而不是相同的字母。非常感谢你。
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void random_string(char * string, unsigned length)
{
/* Seed number for rand() */
srand((unsigned int) time(0));
int i;
for (i = 0; i < length; ++i)
{
string[i] = rand() % 26 + 'A';
}
string[i] = '\0';
}
int main(void)
{
char s[26];
random_string(s, 26);
printf("%s\n", s);
return 0;
}
答案 0 :(得分:7)
您要查找的操作称为 shuffle 或置换。调用一个随机字母函数26次是不够的,因为如你所见,你可以生成重复项。
相反,从字符串"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
开始并执行shuffle操作。如果您想从头开始学习这些东西,我建议您阅读Fisher-Yates Shuffle然后自己制作一个实现。
答案 1 :(得分:1)
您可以通过拥有一个可用字符池并从池中取一个来完成此操作。请注意,您的目标字符串太短,无法容纳字符串终止符。与Fisher Yates shuffle类似。
修改:将类型更改为size_t
。
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LENGTH 26 // the cipher key length
void random_string(char * string, size_t length)
{
char pool[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
size_t poolsize = strlen(pool);
size_t index;
size_t i;
srand((unsigned)time(NULL));
for(i = 0; i < length && poolsize > 0; ++i)
{
index = rand() % poolsize; // a random index into the pool
string[i] = pool[index]; // take that character
pool[index] = pool[--poolsize]; // replace it with the last pool ...
} // ... element and shorten the pool
string[i] = '\0';
}
int main(void)
{
char s[LENGTH + 1]; // adequate length
random_string(s, LENGTH);
printf("%s\n", s);
return 0;
}
节目输出:
QYMUSFALIZCXGONBJRETHPVKDW
答案 2 :(得分:0)
//为什么程序会出错这行? (未使用的变量cipher_text)
char *cipher_text, msg[255];
您声明了cipher_text,但您只使用了msg。
您只能声明:
char msg[255];
答案 3 :(得分:0)
从cplusplus.com/reference复制粘贴
使用参数初始化伪随机数生成器 作为种子传递。
对于调用srand时使用的每个不同的种子值, 可以预期伪随机数发生器产生不同的 在随后的rand调用中继续产生结果。
使用相同种子的两个不同初始化将生成 随后对兰德的调用也会产生相同的结果。
如果seed设置为1,则将生成器重新初始化为其初始值 value并产生与调用rand或之前相同的值 函数srand。
为了生成类似随机数的数字,srand通常被初始化 一些独特的运行时值,如函数返回的值 时间(在标题中声明)。这对大多数人来说足够独特 琐碎的随机化需求。
/* srand example */ #include <stdio.h> /* printf, NULL */ #include <stdlib.h> /* srand, rand */ #include <time.h> /* time */ int main () { printf ("First number: %d\n", rand()%100); srand (time(NULL)); printf ("Random number: %d\n", rand()%100); srand (1); printf ("Again the first number: %d\n", rand()%100); return 0; }