☆ 随机数生成函数

"随机数"在C语言程序设计中也会经常遇到,利用随机数生成函数我们可以获取许多位的随机数、随机数组、随机矩阵等等。

是不是充满了吸引力~

下面就介绍如何使用:

****************************************************************************************************************************************

生成随机数要使用到三个函数:

  • rand():
    rand()函数用来产生随机数,会在0~32767的范围内随机返回一个整型数;
    使用该函数之前需要引用库函数"stdlib.h";
    其函数原型为:int rand(void),参数为空,返回值为一个int型变量。  
    使用rand()函数来产生随机数实际上并不是严格意义上的随机数,它是通过一个算法来模拟输出随机数,因为算法周期比较长,所以基本就达到了"随机",但是如果仅仅使用该函数,那么每次运行输出的结果都是一样的:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int i;
    	system("title 伪随机数示例程序1"); 
    	printf("Random numbers are: %i %i\n",rand(),rand());
    	printf("Random numbers are: %i %i\n",rand(),rand());
    	printf("Random numbers are: %i %i\n",rand(),rand());
    	return 1;
    }
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int i;
    	system("title 伪随机数示例程序2"); 
    	printf("Random numbers are: %i %i\n",rand(),rand());
    	printf("Random numbers are: %i %i\n",rand(),rand());
    	printf("Random numbers are: %i %i\n",rand(),rand());
    	return 1;
    }

    运行两个程序后会发现两次输出的结果是一致的,那么如何实现更好的"随机"呢?这个时候我们就会用到下一个函数。

  • srand():   
    srand()函数是随机数发生器的初始化函数。
    函数原型:void srand(unsigned int seed);,参数是一个整型变量(随机数种子);
    srand()需要与rand()配合使用,rand()在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的,就像上面的两个程序一样,已确定默认种子的值,而srand()函数就起到手动改变种子的作用。  
    但是我们会发现:如果在两个程序中种子设置的是相同的,那么rand()返回的值还是相同的。
    那么有什么办法可以让每次传入的种子都不一样呢(手动一个一个输入除外)? 
    那么我们首先就会想到什么东西是在一直变化的呢?——时间; 
    如果将当前的系统时间提取出来再传入srand函数中,不就可以实现每次种子都不一样了么,Bingo! 
    这就需要使用time()函数:

  • time():  
    time() 是返回自 Unix 纪元(1970.01.01 00:00:00)起的当前时间的秒数的函数,主要用来获取当前的系统时间,返回的结果是一个 time_t(我在另一篇博客中有提到)类型。    
    使用方法:time(0);   
    结合srand使用方法:srand(time(0)); 这就实现了获取不同的随机种子。

rand()函数的一些用法: 

  • rand()%10:rand()函数返回的值对10取余,就可获取0~9的数;
  • i+rand()%(j-i-1) :获取范围在 [i , j]的随机数;

随机数获取示例——获取四位随机数:

  • 提到这个问题的解决方案我们可能会想到使用上面第一种用法:rand()%10000;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
	int i,count=0;
	srand(time(0));
	system("title 获取四位的随机数"); 
	for(i=0;i<30;i++)
	{
		printf("%-6d",rand()%10000);
		count++;
		if(count%5==0)
		{
			printf("\n");
		}
	}
	return 1;
}
  • 但是观察运行结果(为什么出错了呢?回到文章开头的rand()函数介绍看看第一句吧~~):       

  

  • 那么应该怎么样实现呢?(既然获取多位数有问题,那么我就一位一位获取然后把他们拼起来不就可以了嘛~Bingo!)   
    这就需要我么使用数组来保存获取的每一位随机数,然后再将其赋值给一个整型数值,就可以得到一个四位的随机数了。  
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4

int main()
{
	int i,a=0;
	int m=1000;
	int num[4];
	system("title 随机数");
	srand(time(0));
	for(i=0;i<4;i++)
	{
		num[i]=rand()%10;
	}
	for(i=0;i<N;i++)
	{
		printf("%d",num[i]);
	}
	for(i=0;i<N;i++)
	{
		a+=num[i]*m;
		m=m/10;
	}
	return 0;
}
  • 如果有小伙伴是自己敲的,那么可能会写成以下这种形式:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 4

int main()
{
	int i,a=0;
	int m=1000;
	int num[4];
	system("title 随机数");
	for(i=0;i<4;i++)
	{
		srand(time(0));
		num[i]=rand()%10;
	}
	for(i=0;i<N;i++)
	{
		printf("%d",num[i]);
	}
	for(i=0;i<N;i++)
	{
		a+=num[i]*m;
		m=m/10;
	}
	return 0;
}

    什么?你说没看到差别?好吧好吧~那就再多看几遍就吧~~(结合运行结果能不能实际地体会到计算机的运算速度呢?

  • 但是我们又会想到:如果我们想要获取四位不相同的随机数,该怎么办呢?——添加一个过滤功能即可;

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 4
    
    int main()
    {
    	int i,j,a;
    	int m=1000;
    	int num[4];
    	system("title 获取四位随机数");
    	for(i=0;i<4;i++)
    	{
    		srand(time(0));
    		num[i]=rand()%10;
    		for(j=0;j<i;j++)
    		{
    			while(num[i]==num[j] || j<-1)
    			{
    				num[i]=rand()%10;
    				j--;
    			}
    		}
    	}
    	for(i=0;i<N;i++)
    	{
    		printf("%d",num[i]);
    	}
    	for(i=0;i<N;i++)
    	{
    		a+=num[i]*m;
    		m=m/10;
    	}	
    	return 0;
    }

    文章到这就结束了哟~

****************************************************************************************************************************************

             最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。

****************************************************************************************************************************************

猜你喜欢

转载自blog.csdn.net/qq_42292831/article/details/81456598