我是靠谱客的博主 合适蜜蜂,最近开发中收集的这篇文章主要介绍C Programming - 随机数生成,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

"随机数"在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 %in",rand(),rand());
    	printf("Random numbers are: %i %in",rand(),rand());
    	printf("Random numbers are: %i %in",rand(),rand());
    	return 1;
    }
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	int i;
    	system("title 伪随机数示例程序2"); 
    	printf("Random numbers are: %i %in",rand(),rand());
    	printf("Random numbers are: %i %in",rand(),rand());
    	printf("Random numbers are: %i %in",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 10

int main()
{
	int res;
	int num[N];
	srand(time(0));
	for(int i=0;i<N;i++)
	{
		num[i]=rand()%10;
		/*重复检测*/
		int k=0;
		while(k<i){
			if(num[k] == num[i]){
				num[i] = rand()%10;
				k = 0;
				continue;
			}else{
				k++;
				if(k == N){
					break;
				}
			}
		}
	}	
	for(int i=0;i<N;i++){
		printf("%d",num[i]);
	}
	return 0;
}


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



最后

以上就是合适蜜蜂为你收集整理的C Programming - 随机数生成的全部内容,希望文章能够帮你解决C Programming - 随机数生成所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部