C语言中的随机数 && 商余函数ldiv && 长数据分段发送的方法

      在C语言中,rand()函数可以用来产生随机数,但它是一个伪随机数。它的产生结果是根据一个数,我们可以称它为种子为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数。当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统;为了改变这个种子的值,C为此提供了srand()函数,它的原形是void srand( int a)。

      rand()会返回一系列随机数值,为0至RAND_MAX之间的随机数值,而RAND_MAX定义在stdlib.h(其值至少为32767),具体要看你定义的变量类型,int整型的话就是32767。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。

(1)随机数生成实例

      使用rand()和srand()函数。这二个函数的工作过程如下:1) 首先给srand()提供一个种子,它是一个unsigned int类型,其取值范围从0~65535;2) 然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间);3) 根据需要多次调用rand(),从而不间断地得到新的随机数;4) 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。

      下面是0~32767之间的随机数程序:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>           //使用当前时钟做种子
void main( void )
{

       int i;
       srand( (unsigned)time( NULL ) );          //初始化随机数
       for( i = 0; i < 10;i++ )                          //打印出10个随机数
           printf( " %d/n", rand() );
}
(2)产生任意范围内的随机数

       产生1~100之间的随机数可以这样写:
main( )
{

      int i;
      srand( (unsigned)time( NULL ) );  
      for( i = 0; i < 10;i++ )
            printf( "%d/n", rand()%100+1);
}
      如何产生设定范围内的随机数?由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X; 这样,就可以产生你想要的任何范围内的随机数了。比如产生2到10的随机数,则用rand()%9+2即可。

=================================================================================

      对两个长整型数相除,返回类型为ldiv_t,在stdlib.h头文件中定义。

typedef struct

{

      long quot;

      long rem;

} ldiv_t;

quot存储的是商(quotient),rem 存储的是余数(remainder)。

     示例程序如下:

ldiv_t my_ldiv(long num, long denom)

{

     ldiv_t r;

     r.quot = num / denom;

     r.rem = num % denom;

     return (r);

}

int main()

{

     ldiv_t t;

     t = my_ldiv(200,300000000);

     printf("Quotient = %d/tRemainder = %d/n",t.quot,t.rem);

     system("pause");

     return 0;

}

==================================================================================

     假设410个数据缓冲区一次20,依次循环发送

void AppWrite(uint8 *pBuffer, uint8 length)
{ 	
	uint8 tmp = 0,len = length;
	while(true){
		// 240 + 240 +10
		if(len > 20){
			transfer(pBuffer + tmp, 20);
			len -= 20;
			tmp +=20;
		}
		else{
			transfer(pBuffer + tmp, len);
			break;
		}
	}
}

     上述能满足一般的需求,但是如果拆包在组包时有其他数据参杂进来,影响组包,可把每个包在发送时加个Index,组包时根据index组合起来,即可。

#define DataOnce 20
typedef struct 
{
	uint8 TotalLength; <span style="white-space:pre">	</span>//总的分包数
	uint8 CurrentNum;<span style="white-space:pre">	</span>//当前包的index
	uint8 datalength;<span style="white-space:pre">	</span>//数据长度,一般是20,最后一个包按真实长度值
	uint8  data[DataOnce];<span style="white-space:pre">	</span>//数据
}Data_Format_Package;

void sbpSerialAppWrite(uint8 *pBuffer, uint16 length)
{
	uint8 tmp = 0,len = length;
	Data_Format_Package ramb ={0,0,0,{0}};
	ramb.TotalLength = length/DataOnce+1;
	while(1){
		if(len > DataOnce){
			ramb.CurrentNum++;
			ramb.datalength = DataOnce;
			memcpy(ramb.data,pBuffer+tmp,DataOnce);
			
			HalUARTWrite (SBP_UART_PORT, (uint8 *)&ramb , sizeof(Data_Format_Package));
			len -= DataOnce;
			tmp += DataOnce;
			memset(ramb.data,0,DataOnce);
		}
		else{
			ramb.CurrentNum++;
			ramb.datalength = len;
			memcpy(ramb.data,pBuffer+tmp,len);
			
			HalUARTWrite (SBP_UART_PORT, (uint8 *)&ramb , sizeof(Data_Format_Package));
			break;
		}
	}
}


参考原文: http://www.cublog.cn/u/25381/showart_222055.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值