C++产生随机数
rand()
C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand()。 不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随机的伪随机数。 - #include <iostream>
- using namespace std;
- int main() {
- //产生5个范围在[0,10)的随机数
- for ( int i=0;i<5;i++)
- {
- cout << rand()%10 << " ";
- }
- system("pause");
- return 0;
- }
复制代码
两次运行结果为:
srand()
srand()可用来设置rand()产生随机数时的随机数种子。通过设置不同的种子,我们可以获取不同的随机数序列。 可以利用srand((unsigned)time(NULL))的方法,利用系统时钟,产生不同的随机数种子。不过要调用time(),需要加入头文件< ctime >。 - #include <iostream>
- #include <ctime>
- using namespace std;
- int main() {
- srand((unsigned)time(NULL));//产生随机数种子
- for ( int i=0;i<5;i++)
- {
- cout << rand()%10 << " ";
- }
- system("pause");
- return 0;
- }
复制代码
两次运行结果如下:
其它的随机数的范围通式
要取[0,n) 就是rand()%n 表示 从0到n-1的整数; 要取[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围; 要取a到b之间的随机整数,另一种表示:a + int((b-a) * rand() /double (RAND_MAX + 1)); 要取0~1之间的浮点数,可以使用rand() / double(RAND_MAX); 要取-1~1之间的浮点数,可以使用:int a=rand%2+1;double b=pow(-1,a)*rand()/double(RAND_MAX);
C++ 11新特性
C++11提供的实现了随机数库,它通过随机数引擎(random_number_engines)产生随机数序列,随机数分布类(random_number_distribution)使用随机数引擎生成服从特定概率分布的随机数。 下面举一个例子: - #include <iostream>
- #include <random>
- using namespace std;
- int main() {
- uniform_int_distribution<unsigned> u(0, 9);//随机数分布类,范围为[0,9]的整数
- default_random_engine e;//默认的随机数引擎
- cout << e.min() << " " << e.max() << endl;//随机数引擎可取的最小值和最大值
- for ( int i=0;i<5;i++)
- {
- cout << u(e) << " ";
- }
- system("pause");
- return 0;
- }
复制代码
运行结果如下: |