随机密码生成器相同的字符串

时间:2015-05-27 15:05:43

标签: c random passwords

这是我的第一个C程序,我想创建一个随机密码,但每次运行程序时,它都会生成相同的字符串。 (总是生成" pkDHTxmMR1 ...")这实际上不会被使用,所以rand()的安全性对我来说并不重要。为什么每次运行它都会输出相同的字符串?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>  
//this is a program to generate a random password

int main()
{
    int counter = 0;
    srand(time(NULL));
    char randChar;

    int  passwordLength;

    printf("Type in a password Length \n");
    scanf("%d", &passwordLength);

    while(counter < passwordLength)
    {
        //seed random based on time
        srand(time(NULL));
        randChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[random () % 62];    
        printf("%c", randChar);
        counter++;
    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

亲爱的,亲爱的。在我为自己尝试提问者的代码之前,每个人都得到了错误的答案,包括我。

实际上,是的,循环中不应该调用srand(),因为它会在每次迭代时重新设置随机数生成器。但是,在循环外也不应该调用srand()因为用于生成实际随机数的函数是random()而不是rand()。正确的代码是

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

int main()
{
    int counter = 0;
    srandom(time(NULL));  // Correct seeding function for random()
    char randChar;

    int  passwordLength;

    printf("Type in a password Length \n");
    scanf("%d", &passwordLength);

    while(counter < passwordLength)
    {
        randChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[random () % 62];
        printf("%c", randChar);
        counter++;
    }
    printf("\n"); // Stops the output from being on the same line as the prompt
    return 0;
}

答案 1 :(得分:0)

你的循环运行不到一秒钟。

因此,time(NULL)始终返回相同的值,因此您的随机数都具有相同的种子。

不要这样做。

答案 2 :(得分:0)

标准:

  

srand函数使用参数作为新序列的种子   随后对rand的调用返回的伪随机数。如果   然后使用相同的种子值(序列)调用srand   伪随机数应重复。

系统上time_t很可能是基于秒或类似的东西。但srand()次呼叫之间的执行时间远远小于一秒,所以你继续为它提供相同的种子值。

始终只需在整个程序中拨打srand()一次。