小随机数生成程序
Small random number generating program?
我的教授给了我们下面的程序作为随机数生成器
//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.
简而言之,加法的右操作数是包含的最小值,两个数之和是不包含的最大值。
- 半随机数生成C++
- 随机数生成函数说明
- 从给定的随机数组值生成随机数 Arduino程序C++
- C++RNG(随机数生成)优化
- C++ 11 随机数生成不起作用
- 我在一个生成随机数的程序工作,我想将这些数字存储在一个数组中
- 有偏差的随机数生成
- 如何根据用户输入"weighted"随机数生成,使某些数字优先于其他数字?
- 0-1之间的随机数生成以填充容器
- Visual Studio C++ 2012 和 2017 在随机数生成中表现出不同的行为?
- 随机数生成缺少同一种子的模式
- C 伪随机数生成平台依赖关系
- Diffie-Hellman密钥交换的C GMP随机数生成
- 本应生成 2 个介于 1 和 9 之间的随机数的程序C++只生成 6 和 9 并且没有正确循环
- 我简单的 c++ 文本游戏不起作用。我正在使用随机数生成,我很困惑
- 随机数生成:相同的C++代码,两种不同的行为
- c++中使用GMP的随机数生成
- 二项式随机数生成
- 如何在C++中生成的随机数应用程序中使数字不重复
- 小随机数生成程序