关于C++中的随机数

Jim*_*lle 1 c++ random for-loop numbers while-loop

我是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;
}
Run Code Online (Sandbox Code Playgroud)

它运作得很好.但正确的解决方案是

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;
}
Run Code Online (Sandbox Code Playgroud)

它也可以正常工作.我的问题是:为什么解决方案有效?根据我的理解,这个:

rand() % value
Run Code Online (Sandbox Code Playgroud)

给出介于0和给定值之间的值.

所以,因为baseWord.size()返回,所以假设像HELLO这样的单词,就说5.rand将生成一个介于0和5之间的数字.所以它可能是5.并且baseWord [5]超出范围,所以它应该偶尔崩溃一次,但我尝试了超过9000次(抱歉,dbz引用),并且它永远不会崩溃.

我只是不走运,还是我不理解某些事情?

Ben*_*ley 6

x % y给出剩余的x / y.其结果永远不可能y,因为如果是,那么这将意味着y可以进入x一个更多的时间,其余的实际上是零,因为yx均匀.所以回答你的问题:

我只是不走运,还是我不理解某些事情?

你误会了什么.rand() % value给出范围内的结果[0,value - 1](假设值为正),而不是[0, value].