zoukankan      html  css  js  c++  java
  • 每次rand出来都是41?说好的随机数呢?!

    rand()函数是C++标准函数库提供的随机数生成器,生成0-RAND_MAX之间的一个“伪随机”整数,理论上可以产生的最大数值为2^16-1,即32767。

    rand()函数不接受参数,默认以1为种子(seed,即起始值),这里的种子在随机数产生的过程中起了很大的作用,甚至可以说是起了决定性的作用。

    rand()=41?

    了解了这些让我们试着生成一个随机数
    #include<iostream>
    
    using namespace std;
    
    int main(int argc,char*argv[])
    {
    	int randValue=rand();
    	cout<<randValue<<endl;
    	system("pause");
    }



    第1次运行,输出41,第2次运行,输出41,第3、4……次输出仍然是41!说好的rand()产生一个0~32767间的随机整数呢? 
    这里就遗漏了上边提到的“种子”的概念,计算机从算法层面,不可能产生真正的随机数,它只能按照一定的算法定义,生成一系列固定顺序的伪随机数,这就是所谓随机中的规律。rand()函数的实现可以抽象描述成这样:

    int rand()
    {
    	static int seed=XX;
    	return seed=A*seed+B*n;
    }

    这里的A、B、n都是常量值,所以这就意味着rand()产生的随机数就唯一取决于种子seed的值,在我们没有定义初始值的情况下,系统默认给出seed值为1,这就是为什么每次rand出来的值固定都是41的原因。

    如果想生成一系列随机数,仍然可以这样:

    #include<iostream>
    
    using namespace std;
    
    int main(int argc,char*argv[])
    {
    	int randValue[10];
    	for(int i=0;i<10;i++)
    	{
    		randValue[i]=rand();
    		cout<<randValue[i]<<endl;
    	}
    	system("pause");
    }

    生成10个随机数:



    其实这10个数的值和排列顺序是固定的,即你知道了这开头,你也可以猜到这结尾。
    要想打破这一规律,可以使用种子发生器。

    srand()种子生成器

    既然种子这么重要,如何定义种子呢?答案是使用C++中另一个为rand()而生的函数—srand()。
    srand()可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数序列也会相同,比较理想的是使用随时会变化的数,常用时间作为随机数生成器的种子。

    #include<iostream>
    #include <time.h>
    
    using namespace std;
    
    int main(int argc,char*argv[])
    {
    	int randValue[10];
    	srand(time(0));
    	cout<<"本次所用种子为: "<<time(0)<<endl;
    	for(int i=0;i<10;i++)
    	{
    		randValue[i]=rand();
    		cout<<randValue[i]<<endl;
    	}
    	system("pause");
    }

    time(0)的值是从1970年1月1日开始到程序被运行时刻的总秒数。



    如何生成0~N间(N-1)个互不重复的随机数?


    #include<iostream>
    #include <time.h>
    #include<vector>
    
    using namespace std;
    //定义需要生成的随机数数量
    #define Number 15  
    
    void Randarrary( vector<int>& arrarInt) ;
    int main(int argc,char*argv[])
    {
    	vector<int> arrarInt;
    	for(int i=0;i<Number;i++)
    	{
    		arrarInt.push_back(i);
    	}
    	Randarrary(arrarInt);
    	for(int i=0;i<Number;i++)
    	{
    		cout<<"第 "<<i<<" 个不重复的随机数是"<<arrarInt[i]<<endl;
    	}
    	system("pause");
    }
    
    //*******************************************************************//  
    //生成N个互不重复的随机数函数 
    //*******************************************************************//  
    void Randarrary( vector<int>& arrarInt)  
    {  
    	for(int i=0;i<arrarInt.size();i++)  
    	{  
    		srand(int(time(0)));  
    		int a=rand()%(arrarInt.size()-i)+i;  
    		swap(arrarInt[i],arrarInt[a]);  
    	}  
    }

    首先定义一个包含N个int类型元素的向量arrayInt,以0为第一个元素,从小到大依次排列,调用随机函数Randarrary后,依次把每次生成的随机元素跟参与随机运算的第一个元素对调。函数调用的结果是arrayInt向量内保存了0~N内的(N-1)个互不重复的随机数:



     
  • 相关阅读:
    docker
    iOS开发之抓取花瓣网json数据
    iOS与Android工程项目的简单对比
    Android与iOS的比较
    Jenkins时间和centos时间相差八小时解决方法
    MYSQL中索引里面的基数是什么意思
    使用Java写一个minio的客户端上传下载文件
    Java 使用AOP实现打印日志
    macOS使用brew安装mysql8.x
    MacOS安装homebrew报错:curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411999.html
Copyright © 2011-2022 走看看