创建一个随机字符串只会产生重复的字符串



所以我尝试使用rand()和随机,但每次都会导致相同的问题,所有创建的字符串都是重复的。我想问题可能出在数字生成器上,但我也不知道。

#include<iostream>
#include<unistd.h>
#include<fstream>
#include<string>
#include<cstdlib>
#include<time.h>
#include<random>
using namespace std;
int count;
char letter;
string word;
char ls[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'M', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(0, 51); 
string code()
{
for (int i = dis(gen) ; count != 13; count++){
word += ls[i];
i = dis(gen); 
}
return word;
}
int main()
{
srand(time(0));
while(true){       
cout << code() <<"n";
srand(time(0));
}
sleep(10);

}
for (int i = dis(gen) ; count != 13; count++){

当你的代码第一次调用这个函数时,这个for循环将一直计数直到这个count达到13。这是相当简单和基本的。

但是你会惊讶地发现第二次你的代码调用这个函数时,count仍然是上次的值:13。为什么会是别的呢?毕竟,在第一次和第二次调用这个函数之间,代码中没有任何东西改变它。所以这个for循环什么都不做。count已经13了

此外,第一次调用该函数时,随机字母会累积在word中。你猜怎么着?这个word仍然完全相同。毕竟,没有任何东西改变或清除word

所以这个函数在第二次被调用时不做任何事情,它只是返回相同的word。它每次被调用时都做同样的事情。这就是为什么每次都得到相同的字符串。

你需要做的就是记住计算机编程的黄金法则:"你的计算机总是按照你告诉它的去做,而不是按照你想要它做的去做"。如果你想让你的计算机总是从0开始计数,并把随机生成的字母放入一个新单词中,每次调用这个函数:那么这正是你需要告诉你的计算机做的。最简单的解决方案是简单地将countword声明为该函数的局部变量,并显式地将count初始化为0(而不是将它们作为全局变量)。这是c++中一个非常流行的经验法则:全局变量越多,存在bug的可能性就越大。

哦,显示的代码只需要调用srand一次。在所示的代码中,它可能会也可能不会做任何事情,但是反复调用srand只会使事情变得更糟,而不是更好。

最新更新