在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()0+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