我想使用while循环为变量生成一个随机数,以拼出一个乱码。我的问题是我的代码生成的数字是随机的,但重复该数字而不是使用新数字。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
string wordList[5] = {"cool", "friend", "helpful", "amazing",
"person"};
srand(time(0));
int rWord = rand() % 5 + 1;
string randWord = wordList[rWord];
int runs = 0;
int wordLen = randWord.length();
while(runs != wordLen){
int ranLN = rand() % wordLen;
char randLetter = randWord[ranLN];
cout << randLetter;
runs++;
}
return 0;
}
我希望我的结果是一个完全混乱的单词,但我反而收到了重复的字母。例如,我把“朋友”一词加为“ eennn”。
答案 0 :(得分:2)
如注释中所建议,rWord
的当前范围是1,2,3,4,5
,必须固定为0,1,2,3,4
。
因此,在以下答案中,我从其初始化方程式中删除了+1
。
另外,ranLN
可以重复,因此您可以重复输入字母。
然后,一种可能的方法是递归改组randWord
的所有字符,并在while循环完成后输出它们,如下所示。
以here为例显示了相同的算法:
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <utility>
int main()
{
std::string wordList[5] = {"cool", "friend", "helpful", "amazing", "person"};
srand(time(0));
std::size_t rWord = rand() % 5;
std::string randWord = wordList[rWord];
std::size_t runs = 0;
std::size_t wordLen = randWord.length();
while(runs != wordLen)
{
std::swap(randWord[runs], randWord[rand() % wordLen]);
++runs;
}
std::cout << randWord << std::endl;
return 0;
}
顺便说一句,尽管rand()
通常应该由更好的LCG来实现,
但是,例如(在我的本地)C ++标准草案n4687中指出的, rand()
中使用的算法是完全由编译器实现定义的:
29.6.9低质量随机数生成[c.math.rand]
int rand(); void srand(unsigned int seed);
... rand 的基础算法未指定。因此, rand 的使用仍然是不可移植的,其质量和性能不可预测且经常令人质疑。
幸运的是,在C ++ 11及更高版本中,我们可以使用<random>
来生成保证的质量随机性。
因此,我建议您将它们与std::shuffle
一起使用,如下所示。
如果您需要更高质量的随机性,可以使用std::mt19937
代替std::minstd_rand
:
#include <iostream>
#include <string>
#include <random>
#include <algorithm>
int main()
{
std::string wordList[5] = {"cool", "friend", "helpful", "amazing", "person"};
std::minstd_rand gen(std::random_device{}());
std::uniform_int_distribution<std::size_t> dis(0, 4);
std::size_t rWord = dis(gen);
std::string randWord = wordList[rWord];
std::shuffle(randWord.begin(), randWord.end(), gen);
std::cout << randWord << std::endl;
return 0;
}
答案 1 :(得分:0)
以我的拙见,在生成所有随机词之后,使用设置数据结构会使随机词唯一。