关于C ++中的随机数

时间:2016-05-26 03:54:08

标签: c++ for-loop random while-loop numbers

我对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引用),并且它永远不会崩溃。

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

3 个答案:

答案 0 :(得分:6)

x % y给出x / y的余数。结果永远不会是y,因为如果是,那么这意味着y可能再次进入x,其余的实际上将为零,因为{{1} }均匀地划分y。所以回答你的问题:

  

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

你误解了什么。 xrand() % 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之间的值,因此永远不会遇到越界错误。