随机数
思路1
在C++中,生成随机数的函数为rand()
,返回一个不大于RAND_MAX
的非负数。但是,如果生成随机数的种子和生成的次数相同,那么生成的随机数相同,因此rand()
只能生成伪随机数。为了尽量得到真随机数,每次应该取不同的种子,由于time(NULL)
返回从1970.1.1/00:00到现在的秒数,可以采用srand(time(NULL))
。因为程序运行非常快,两次取随机数的间隔可能不超过 1 1 1秒,所以在生成随机数的函数中设置种子有可能返回同一个值,事实上每次运行程序设置一次种子就够了。为了生成区间 [ a , b ] [a, b] [a,b]的随机数,可以简单地取rand() % (b-a+1) + a
。各随机数对应区间如下:
随机数 | 区间 |
---|---|
rand() % (b-a+1) |
[ 0 , b − a ] [0, b-a] [0,b−a] |
rand() % (b-a+1) + a |
[ a , b ] [a, b] [a,b] |
模板1
#include <cstdio>
#include <cstdlib>
#include <ctime>
typedef long long LL;
bool tag = false;
/**
* @return: the random integer in [a, b]
*/
LL getRandInt(LL a, LL b) {
if (!tag) {
srand(time(NULL));
tag = true;
}
return rand() % (b-a+1) + a;
}
思路2
然而,按照思路1的方法得到 [ a , b ] [a, b] [a,b]中每一个数的概率并不相等。举个例子,设rand()
返回的最大值RAND_MAX
为 M M M,那么对于区间 [ 0 , M −