C++中用rand()生成大随机数

您所在的位置:网站首页 rand随机生成范围内 C++中用rand()生成大随机数

C++中用rand()生成大随机数

2023-12-27 09:55| 来源: 网络整理| 查看: 265

需求:

前几天写程序时有一个需求是随机生成1000000个[0,1000000)之间的随机整数,当然首选是rand()和srand()。但是后来我查看生成的数据时发现,有很多数据都是3万多,但是没有4万以上的数据,这不符合常理。然后试验了几次后发现还是一样的情况,然后我就百度了一下,结果发现rand()生成的最大整数是32767,也就是说,我们使用rand()生成随机数的范围只能是[0,32767),这显然不符合要求。下面是解决方法:

法一:

我在网上找了一下方法,发现了一种比较靠谱的方法,于是就试了试。语句是这样的:

(int) ((double)rand() / RAND_MAX) * 1000000;

RAND_MAX是C标准库中的一个宏,是中伪随机数生成函数rand()所能返回的最大数值,值为32767。上面语句的主要思路是,生成一个[0,1]范围内的double型随机数,然后乘以你需要的范围的最大值,比如我的话就乘1000000,之后取整一下得到的就是[0,1000000)。思路我觉得很正确,然后我就用这个方法生成了1000000个随机数,然后生成结果见下图: 图中每一行是随机生成的两个数,相当于我一次生成了1000000对数据,不过这不重要,每行的第一个数据是有序的(当然在这里为了能看清数据的规律,所以删掉了一部分数据),我们可以看出,第一列的数据是以30或31交替递增的。这是因为随机数出的整数相差1的话,1 / RAND_MAX = 0.000030518…,然后再乘以1000000后,差值为30.518,取整之后,差值由于累加的缘故,所以可能是30,也可能是31。 所以在这里,虽然理论上这种方法是可行的,但是实际上它并不能以均等的概率取到随机的整数。所以这里我想到了第二种方法,虽然看起来可能有一些繁琐,但是事实证明,是好用的,可以得到预期的结果。

法二:

这个方法的主要思路是根据生成随机数的范围,确定随机数的最大位数,比如我这里生成的是[0,1000000)内的整数,这里的整数就是0-999999,随机整数最大位数为6位。这里我们将每一个位数看做是一个随机数,事实上每一位就是一个随机数,说到这里大家可能就懂了,就是分别产生每一位对应的随机数,然后通过流拼接到一起,构成我们需要的随机数。下面附上代码(以生成[0,1000000)之间的随机数为例):

#include #include #include ; #include #include using namespace std; int main(){ int u; int * u_arr; string u_str; u_arr = new int[6]; srand((unsigned int)(time(NULL))); for(int i = 0; i int num; int totalNum; srand((unsigned int)(time(NULL))); for(int i = 0; i num = rand() % 10; totalNum += num * pow(10, j); } cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3