这是我的第一个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;
}
答案 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()
一次。