我是我的源代码,我只是不能混淆我的话,它给了我任何我不想要的东西。
我没有错误,没有任何警告,但是如果我放了一个例子:papa,它给了我'p a',为什么? 谢谢你的帮助!
#include <iostream>
#include <string>
#include <random>
#include <chrono>
using namespace std;
string melangeLettre(string mot);
int main()
{
cout << "Saisissez un mot mystere: \n> ";
string motMystere{};
cin >> motMystere;
cout << "Quel est ce mot ? \n";
string const newMot = melangeLettre(motMystere);
cout << newMot << endl;
return {0};
}
string melangeLettre(string mot)
{
size_t random = chrono::system_clock::now().time_since_epoch().count();
mt19937 gen{random};
string newMot{};
for (unsigned int i{}; i < mot.size(); ++i)
{
uniform_int_distribution<> getNbr(0, mot.size());
newMot.push_back(mot[getNbr(gen)]);
mot.erase(i, 1);
}
return newMot;
}
答案 0 :(得分:2)
您的代码中存在一些问题。您选择的分布:
uniform_int_distribution<> getNbr(0, mot.size());
会导致数字包括 mot.size()
超过字符串结尾。非空字符串中的最后一个字符的索引为mot.size()-1
。
在此代码中:
newMot.push_back(mot[getNbr(gen)]);
mot.erase(i, 1);
将一个字符复制到新单词,然后从原始单词中删除一个不同的字符(它可能是相同的字符,但只是偶然)。您可能希望删除添加到新单词的相同字符,如:
auto j = getNbr(gen);
newMot.push_back(mot[j]);
mot.erase(j, 1);
您的循环迭代次数太少,因为您要从每个循环中的单词中删除字符。因此,您只需要迭代直到原始单词为空。
这三件事将你的函数循环改为:
while (mot.size() > 0)
{
uniform_int_distribution<> getNbr(0, mot.size()-1);
auto j = getNbr(gen);
newMot.push_back(mot[j]);
mot.erase(j, 1);
}