关于C++; 我对C++很陌生。我正在学习一门免费的在线课程,我要做的一件事就是创建一个可以对字符串字符进行置乱的程序
因此,我创建了一个函数,该函数接收单词作为参数,并返回加扰的单词。包括ctime和cstdlib以及srand(时间(0));主要声明 基本上,函数如下所示:关于C++; 我对C++很陌生。我正在学习一门免费的在线课程,我要做的一件事就是创建一个可以对字符串字符进行置乱的程序,c++,for-loop,random,while-loop,numbers,C++,For Loop,Random,While Loop,Numbers,因此,我创建了一个函数,该函数接收单词作为参数,并返回加扰的单词。包括ctime和cstdlib以及srand(时间(0));主要声明 基本上,函数如下所示: std::string mixingWord(std::string baseWord) { std::string mixWord; int pos(0); for (int i = baseWord.length; i >= 0; i--) { if (i != 0) { pos = rand() % i;
std::string mixingWord(std::string baseWord)
{
std::string mixWord;
int pos(0);
for (int i = baseWord.length; i >= 0; i--)
{
if (i != 0)
{
pos = rand() % i;
mixWord += baseWord[pos];
baseWord.erase(pos,1);
}
else
{
mixWord += baseWord[0];
}
}
return mixWord;
}
而且效果很好。但正确的解决办法是
std::string mixingWord(std::string baseWord)
{
std::string mixWord;
int pos(0);
while (baseWord.size() != 0)
{
pos = rand() % baseWord.size();
mixWord += baseWord[pos];
baseWord.erase(pos, 1);
}
return mixWord;
}
而且效果也不错。
我的问题是:
为什么解决方案有效?
据我所知,这是:
rand() % value
给出一个介于0和给定值之间的值
因此,既然baseWord.size()返回,那么对于像HELLO这样的单词,我们假设为5。兰德将生成一个介于0和5之间的数字。所以可能是5。基字[5]是越界的,所以它应该偶尔崩溃一次,但我尝试了9000多次(对不起,dbz引用),它从未崩溃
是我运气不好,还是我不懂什么?
x%y
给出了x/y
的剩余部分。结果永远不可能是y
,因为如果是,则意味着y
可以再进入x
一次,剩余部分实际上是零,因为y
平均除以x
。所以要回答你的问题:
是我运气不好,还是我不明白
你误解了什么
rand()%value
给出范围[0,value-1]
(假设值为正)内的结果,而不是[0,value]x%y
给出x/y
的剩余部分。结果永远不可能是y
,因为如果是,则意味着y
可以再进入x
一次,剩余部分实际上是零,因为y
平均除以x
。所以要回答你的问题:
是我运气不好,还是我不明白
你误解了什么rand()%value
给出范围[0,value-1]
(假设值为正数)的结果,而不是[0,value]rand()%100返回0到99之间的数字。这是100个数字,但包括0,不包括100
考虑这一点的一个好方法是随机数(1000)%100=0。如果我用数字N修改一个随机数,那么就没有办法把数字N取回来
沿着这些路线
pos=rand()%baseWord.size();
永远不会返回pos=baseWord.size(),因此在您的情况下不会出现索引问题。rand()%100返回0到99之间的数字。这是100个数字,但包括0,不包括100
考虑这一点的一个好方法是随机数(1000)%100=0。如果我用数字N修改一个随机数,那么就没有办法把数字N取回来
沿着这些路线
pos=rand()%baseWord.size();
将永远不会返回pos=baseWord.size(),因此在您的情况下不会出现索引问题我猜您只是误解了模运算符。a%b(a和b为任意整数)将返回介于0和b-1(含)之间的值
对于HELLO示例,它只返回0到4之间的值,因此永远不会遇到越界错误 我猜你只是误解了模运算符。a%b(a和b为任意整数)将返回介于0和b-1(含)之间的值
对于HELLO示例,它只返回0到4之间的值,因此永远不会遇到越界错误 谢谢你的回复,我现在明白了。事实上,我认为%符号更像是一个指示器,而不是真正的模运算符,比如在这个和(%)那个之间的随机数。这样更有意义。谢谢你的回复,我现在明白了。事实上,我认为%符号更像是一个指示器,而不是真正的模运算符,比如在这个和(%)那个之间的随机数。这就更有意义了。谢谢你的回复,正如我在另一篇评论中所说的,我认为%符号更像是一个指示符,而不是真正的模运算符,在这个和(%)那个之间是随机的。感谢大家指出这一点。感谢你们的回复,正如我在另一篇评论中所说的,我认为%符号更像是一个指示符,而不是真正的模运算符,在这个和(%)那个之间是随机的。感谢大家指出这一点。感谢你们的回复,我现在理解这一行是如何工作的。感谢你们的回复,我现在理解这一行是如何工作的。还要注意标准库功能:std::random_shuffle(begin(baseWord),end(baseWord))代码>还要注意标准库的功能:std::random_shuffle(begin(baseWord),end(baseWord))代码>