小随机数生成程序

Small random number generating program?

本文关键字:随机数生成程序      更新时间:2023-10-16

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

//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;
}

我想知道是否改变

行的"10"
 myRandom = rand()%10 + 1;

到"20"会给我一个1到20之间的随机数,以此类推。

是的。这取决于函数的工作方式。

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

我跑题了。

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

这可以归结为基本的数学逻辑——任何数除以10都不可能有等于或大于10的余数。同样,任何数除以257,余数都不可能等于或大于257。

因此,模数的第二个操作数设置了不包含的最大值——总是比它小1。

然而,我们有一个问题——我们可以从rand()%本身的模数中得到的最低可能结果是0。(280/280 = 1,余数0)因此,必须对结果进行偏移。

这就是为什么我们添加一个值来设置较低的值。算法中可能的最小随机数是0 +我们指定的

因此,由于rand % 20在最低时可以产生0,如果我们将1加进去,那么最低值现在是1。附带的好处是,由于包含的最大值是19,所以这个数字上升到了20。耶!

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

然而,我们再次有另一个警告。如果我们加一个比1大的数,我们就把最大值向上移动!在rand % 20 + 3的情况下,最小的值是3,但现在最大的值是22,这是我们不想要的!我们怎么抵消呢?

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

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

简而言之,加法的右操作数是包含的最小值,两个数之和是不包含的最大值