zoukankan      html  css  js  c++  java
  • C++用rand()和srand()生成随机数

    内容来自《编程实战宝典》

    首先来看函数原型

    int rand(void);
    
    void srand(unsigned int seed);

    1、rand()函数不需要任何参数,直接返回一个随机数,注意,这个随机数是有范围的,在0~RAND_MAX之间,RAND_MAX一般最小取值为32767,其具体值在头文件stdlib.h中进行定义

    2、srand需要一个无符号整形数作为参数(种子),如果作为种子的无符号数相同,那么获取的随机数也就相同,注意:srand()必须配合rand()使用才能有效果 

    下面是用法

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int i;
    
    	cout << "测试rand()函数" << endl;
    	cout << "随机数最大值RAND_MAX为:" << RAND_MAX << endl;
    	for (i = 0; i < 3;i++)
    	{
    		cout << "num = " << rand() << endl;
    	}
    
    	cout << "测试srand()函数" << endl;
    	cout << "使用不同的种子生成随机数" << endl;
    	for (i = 0; i < 3;i++)
    	{
    		srand(i);
    		cout << "num = " << rand() << endl;
    	}
    
    	cout << "使用相同的种子生成随机数" << endl;
    	for (i = 0; i < 3;i++)
    	{
    		srand(2);
    		cout << "num = " << rand() << endl;
    	}
    }
    

     

    以下是结果 

    可以看出,在使用srand()函数时,如果使用相同的种子,那么最终用rand()函数所生成的随机数也相同

    特定随机数的生成

    为了使rand()函数生成的随机数在一定的范围内,可以使用如下表达式

    a + rand() % n
    

      

    使用上述表达式生成的随机数的范围在a ~ (a + n)之间,其中a为生成的随机数的最小值,a + n - 1为最大值。

    例子如下

    #include <iostream>
    using namespace std;
    int main()
    {
    	cout << "生成特定范围内的随机数:" << endl;
    	cout << "生成5 到 15 之间的随机数" << endl;
    	for (int i = 0; i < 5;i++)
    	{
    		cout << "num = " << 5 + rand() % 10 << endl; //可生成5,6,7,...,14,不包含15
    	}
    }
    

      

    结果如下

     使用系统时间作为种子生成随机数

    为了让随机数更像随机数,降低人为因数的干扰,可以使用系统当前时间作为种子产生随机数

    #include <iostream>
    #include <time.h>		//时间函数time()的头文件
    #include <windows.h>	//暂停函数Sleep()的头文件
    using namespace std;
    
    int main()
    {
    	cout << "使用系统时间作为种子生成随机数:" << endl;
    	for (int i = 0; i < 5;i++)
    	{
    		Sleep(1000);	//暂停一秒,避免因程序执行过快,5次循环中系统时间未发生变化,导致产生的随机数也相同
    		srand((unsigned)time(NULL));
    		cout << "num = " << rand() << endl;
    	}
    	return 0;
    }
    

      

    结果

    也可以使用系统时间作为种子生成特定范围内的随机数

      懒得举例了。。

  • 相关阅读:
    [noip2013]华容道
    [tyvj 1061] Mobile Service (线性dp 滚动数组)
    [bzoj 2726] 任务安排 (斜率优化 线性dp)
    [洛谷 P2365] 任务安排 (线性dp)
    [poj 3666] Making the Grade (离散化 线性dp)
    【模板】manacher算法
    [tyvj 1071] LCIS
    [NOIP 2012] 国王游戏
    [NOIP 2010] 关押罪犯 (二分+二分图判定 || 并查集)
    [NOI 2002] 银河英雄传说 (带权并查集)
  • 原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/10446960.html
Copyright © 2011-2022 走看看