3.3.5.linux中使用随机数 srand

3.3.5.linux中使用随机数

3.3.5.1、随机数和伪随机数

(1)随机数是随机出现,没有任何规律的一组数列。

      例如:抽奖 、

(2)真正的完全随机的数列是不存在的,只是一种理想情况。我们平时要用到随机数时一般只能通  过一些算法得到一个伪随机数序列。
(3)我们平时说到随机数,基本都指的是伪随机数。

3.3.5.2、linux中随机数相关API
(1)连续多次调用 rand 函数可以返回一个伪随机数序列
(2) srand 函数用来设置 rand 获取的伪随机序列的种子

 我们先把 RAND_MAX 打印出来

代码:

#include <stdio.h>
#include <stdlib.h>



int main (void)
{
	
	
	printf("RAND_MAX = %d \n", RAND_MAX);
	
	
	
	return 0;
}


运行结果:

 2. 直接打印 6 个 0 - 2147483647   随机数

代码:

#include <stdio.h>
#include <stdlib.h>



int main (void)
{
	int i = 0, val = 0;
	printf("RAND_MAX = %d \n", RAND_MAX);  //2147483647 
	
	for(i=0; i<6; i++)
	{
		val = rand();
		printf("val = %d ", val);
	}
	
	
	
	return 0;
}

运行结果:

 3.  如果我想打印 0 - 6 直接的伪随机数

代码:

#include <stdio.h>
#include <stdlib.h>



int main (void)
{
	int i = 0, val = 0;
	printf("RAND_MAX = %d \n", RAND_MAX);  //2147483647 
	
	for(i=0; i<6; i++)
	{
		val = rand();
		printf(" %d ", val % 6);  // 把这个 val 值对 6 取余		
	}
	printf("\n");
	
	
	return 0;
}

运行结果:

 3.3.5.3、实战演示
(1)单纯使用rand重复调用n次,就会得到一个0-RAND_MAX之间的伪随机数,如果需要调整范围,可以得到随机数序列后再进行计算。
(2)单纯使用rand来得到伪随机数序列有缺陷,每次执行程序得到的伪随机序列是同一个序列,没法得到其他序列
(3)原因是因为rand内部的算法其实是通过一个种子(seed,其实就是一个原始参数,int类型),rand内部默认是使用1作为seed的,种子一定的算法也是一定的,那么每次得到的伪随机序列肯定是同一个。
(4)所以要想每次执行这个程序获取的伪随机序列不同,则每次都要给不同的种子。用srand函数来设置种子。

4.  srand 设置 种子

代码:

#include <stdio.h>
#include <stdlib.h>



int main (int argc, char **argv)
{
	int i = 0, val = 0;
	if(argc != 2)
	{
		printf("usage: %s num \n",argv[0]);
		return -1;
	}
	
	
	printf("RAND_MAX = %d \n", RAND_MAX);  //2147483647 
	
	//srand 设置 一个种子
	srand(atoi(argv[1]));  //atoi 函数是把  字符串 的数字,转成 int 类型的数字
	
	for(i=0; i<6; i++)
	{
		val = rand();
		printf(" %d ", val % 6);  // 把这个 val 值对 6 取余		
	}
	printf("\n");
	
	
	return 0;
}

运行结果:

 一般我们这样来 设置种子

srand(time(NULL));  //由 time 的返回值 ,来决定随机种子,只要程序运行之间大于 1s ,那么得到的随机数就不一样

代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main (int argc, char **argv)
{
	int i = 0, val = 0;
#if 0
	if(argc != 2)
	{
		printf("usage: %s num \n",argv[0]);
		return -1;
	}
#endif
	
	printf("RAND_MAX = %d \n", RAND_MAX);  //2147483647 
	
	//srand 设置 一个种子
	//srand(atoi(argv[1]));  //atoi 函数是把  字符串 的数字,转成 int 类型的数字
	srand(time(NULL));  //由 time 的返回值 ,来决定随机种子,只要程序运行之间大于 1s ,那么得到的随机数就不一样
	
	for(i=0; i<6; i++)
	{
		val = rand();
		printf(" %d ", val % 6);  // 把这个 val 值对 6 取余		
	}
	printf("\n");
	
	
	return 0;
}

运行结果


3.3.5.5、在linux系统中获取真正的随机数
(1)linux系统收集系统中的一些随机发生的事件的时间(譬如有人动鼠标,譬如触摸屏的操作和坐标等)作为随机种子去生成随机数序列。
 

代码来自:朱老师物联网大讲堂

疑问:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大漠飞鹰6666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值