欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

☆ 随机数生成函数

程序员文章站 2022-05-26 23:33:21
...

"随机数"在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;
    }

    文章到这就结束了哟~

 

 

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

 

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

 

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