关于C++; 我对C++很陌生。我正在学习一门免费的在线课程,我要做的一件事就是创建一个可以对字符串字符进行置乱的程序

关于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;

因此,我创建了一个函数,该函数接收单词作为参数,并返回加扰的单词。包括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;
    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))