我的教授给了我们以下程序作为随机数生成器
//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之间的随机数,依此类推。
答案 0 :(得分:4)
是的,确实如此。这取决于该功能的运作方式。
rand()
(docs)是伪随机数字生成器。这很重要 - 它实际上并不是随机的,如果它没有被正确使用,它可以变得相当可预测。如果你想要更多不可预测的数字,那就更复杂了。如果你想真正随意,那就是一些疯狂的计算!
当你调用rand()
时,它会返回一个介于0和一些大数字RAND_MAX
(docs)之间的整数。为了控制上限,你必须使用模%
运算符(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.
简而言之,加法的右操作数是包含最小值,两个数字的总和是非包容性最大值。