我对C ++很陌生。我正在关注一个免费的在线课程,我必须做的一件事就是创建一个可以扰乱字符串字符的程序。
所以,我创建了一个函数,它接收单词作为参数并返回加扰的单词。包括ctime和cstdlib并且srand(time(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;
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。 rand将生成一个介于0和5之间的数字。所以它可能是5.并且baseWord [5]超出范围,所以它应该偶尔崩溃一次,但我尝试了超过9000次(抱歉,dbz引用),并且它永远不会崩溃。
我只是不走运,还是我不理解某事?
答案 0 :(得分:6)
x % y
给出x / y
的余数。结果永远不会是y
,因为如果是,那么这意味着y
可能再次进入x
,其余的实际上将为零,因为{{1} }均匀地划分y
。所以回答你的问题:
我只是不走运,还是我不理解某事?
你误解了什么。 x
在rand() % value
范围内给出结果(假设值为正),而不是[0,value - 1]
。
答案 1 :(得分:3)
rand()%100返回0到99之间的数字。这是100个数字,但包含0且不包括100.
考虑这个问题的一个好方法是随机数(1000)%100 = 0.如果我用数字N修改一个随机数,那么就没有办法得到数字N.
沿着这些路线 pos = rand()%baseWord.size(); 永远不会返回pos = baseWord.size()所以在你的情况下不会有索引问题
答案 2 :(得分:1)
我猜你只是误解了模运算符。 a%b,a和b任何整数,将返回 0和b-1(含)之间的值。
至于你的HELLO示例,它只返回0到4之间的值,因此永远不会遇到越界错误。