在C中生成随机字母

时间:2016-11-23 16:42:24

标签: c encryption random

这是我的代码。我正在尝试生成随机字母,但我看到相同的字母。 例如:( 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;
}

4 个答案:

答案 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;
}