小随机数生成程序?

时间:2015-10-15 18:11:49

标签: c++ c++11 random

我的教授给了我们以下程序作为随机数生成器

//program to demonstrate random number generator

#include<iostream>
#include<cstdlib> //needed for random number generation
#include<ctime> //needed for random number generation
using namespace std;

int main()
{
  int myRandom = 0;

  srand(time(NULL)); //seed random number generator - only needs to be done once

  //generate a random number from 1 to 10

  myRandom = rand()%10 + 1; //include this code whenever you want a random number generated

  //display the random number
  cout<<"Random number = "<<myRandom<<endl;

  return 0;
}

我想知道是否要更改&#34; 10&#34;在行

 myRandom = rand()%10 + 1;

到&#34; 20&#34;会给我一个1到20之间的随机数,依此类推。

1 个答案:

答案 0 :(得分:4)

是的,确实如此。这取决于该功能的运作方式。

rand()docs)是伪随机数字生成器。这很重要 - 它实际上并不是随机的,如果它没有被正确使用,它可以变得相当可预测。如果你想要更多不可预测的数字,那就更复杂了。如果你想真正随意,那就是一些疯狂的计算!

我离题了。

当你调用rand()时,它会返回一个介于0和一些大数字RAND_MAXdocs)之间的整数。为了控制上限,你必须使用模%运算符(docs),它返回除法的余数,而不是商。

归结为基本的数学逻辑 - 任何数字除以 10 的余数都不能等于或大于10.同样,任何数字除以 257 永远不能有等于或大于257的余数。

因此,模数的第二个操作数设置非包容性最大值 - 我们总是比它少一个。

然而,我们遇到了一个问题 - 我们从rand()和模数%本身得到的最低结果是0.(280/280 = 1,余数 0 )。因此,我们必须抵消结果。

这就是我们添加值来设置较低值的原因。算法中可能的最低随机数是 0 +我们指定的数字

因此,由于rand % 20可以在最低处产生0,如果我们向其添加1,那么最低值现在为1.副作用是,由于包含最大值为19,最多移动到20. Yay!

rand() % 20 + 1 //Yields number between 1-20

但是,我们再次提出另一个警告。如果我们添加大于1的任何内容,我们会向上移动最大数量!在rand % 20 + 3的情况下,最低值为3,但现在 22 最高,我们不想要!我们如何抵消这一点?

现在,我们需要一点数学上的聪明才智。必须更改模数上的右操作数,使其加上偏移量等于非包含性最大值

rand() % 18 + 3 //Yields number between 3 and 20 inclusively.

简而言之,加法的右操作数是包含最小值,两个数字的总和是非包容性最大值