欢迎来到天天文库
浏览记录
ID:40907759
大小:36.00 KB
页数:5页
时间:2019-08-10
《非等概率随机》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、非等概率随机 对一序列数字随机时一般都是等概率的,但有时候希望某些数字出现的可能性更高一些。下面是本人实现的一个非等概率随机函数,可以对序列中多个数字设置不同的出现频率。限于编码水平,如有需要改进之处敬请指点./****************************rand_seting.h********************************/#ifndefRAND_SETING_H#defineRAND_SETING_H#include#include/* * 随机条件结构: * 定义min到max之间个数字出现的频率
2、,默认为1次. * 如果希望某些数字出现频率大于1次,则把这些数字存入数字集(由pmore指向), * 对应的出现频率存入频率集(由ptms指向),这两个缓冲区由用户定义及设置, * lmore和ltms分别为对应的缓冲区长度,建议两缓冲区长度相等,允许ltms>lmore, * 但绝不允许ltms3、,7,15}lmore=3 * ptms指向的缓冲区为{5,10,20}ltms=3(建议为此值,但也可以大于3) * 当根据这个条件产生随机数时,随机区间为:20+(5-1)+(10-1)+(20-1)=52 * 3被随机到的概率为:5/52 * 7被随机到的概率为:10/52 *15被随机到的概率为:20/52 *其它数字的概率则为:1/52 */structrd_dat{ long min; //起始值 long max; //终止值 long *pmore; //高频率数字集 long 4、 lmore; //数字集长度 long *ptms; //高频率数字对应的频率集(出现次数) long ltms; //频率集长度};/* * 结构初始化 * 返回值:结构指针 */structrd_dat*rdinit(structrd_dat*rt,longmin,longmax, long*pm,longlm,long*pt,longlt){ rt->min=min; rt->max=max; rt->pmore=pm; rt->lmore=lm; rt->pt5、ms=pt; rt->ltms=lt; returnrt;}/* * 获取随机数,存放在bufret数组中,个数为数组长度bufsz * 返回值:出现非法数据返回-1;否则成功返回,值为获取到随机数的个数(bufsz) */intrdget(conststructrd_dat*rt,long*bufret,longbufsz){ long rval,exmax=0; long i,j,tmp; //验证数据的合法性 if(rt->min>rt->max6、7、rt->lmore!=rt->ltms8、9、bufsz<1){10、 return-1; } if(rt->pmore==NULL11、12、rt->ptms==NULL13、14、bufret==NULL){ return-1; } for(i=0;ilmore;i++){ if(rt->pmore[i]min15、16、rt->pmore[i]>rt->max){ return-1; } if(rt->ptms[i]<1){ return-1; } } 17、 //获取扩展最大值 exmax=rt->max-rt->min+1; for(i=0;iltms;i++){ exmax+=rt->ptms[i]-1; } //获取bufsz个随机数 srand(time(NULL)); //初始化随机数发生器 for(i=0;i
3、,7,15}lmore=3 * ptms指向的缓冲区为{5,10,20}ltms=3(建议为此值,但也可以大于3) * 当根据这个条件产生随机数时,随机区间为:20+(5-1)+(10-1)+(20-1)=52 * 3被随机到的概率为:5/52 * 7被随机到的概率为:10/52 *15被随机到的概率为:20/52 *其它数字的概率则为:1/52 */structrd_dat{ long min; //起始值 long max; //终止值 long *pmore; //高频率数字集 long
4、 lmore; //数字集长度 long *ptms; //高频率数字对应的频率集(出现次数) long ltms; //频率集长度};/* * 结构初始化 * 返回值:结构指针 */structrd_dat*rdinit(structrd_dat*rt,longmin,longmax, long*pm,longlm,long*pt,longlt){ rt->min=min; rt->max=max; rt->pmore=pm; rt->lmore=lm; rt->pt
5、ms=pt; rt->ltms=lt; returnrt;}/* * 获取随机数,存放在bufret数组中,个数为数组长度bufsz * 返回值:出现非法数据返回-1;否则成功返回,值为获取到随机数的个数(bufsz) */intrdget(conststructrd_dat*rt,long*bufret,longbufsz){ long rval,exmax=0; long i,j,tmp; //验证数据的合法性 if(rt->min>rt->max
6、
7、rt->lmore!=rt->ltms
8、
9、bufsz<1){
10、 return-1; } if(rt->pmore==NULL
11、
12、rt->ptms==NULL
13、
14、bufret==NULL){ return-1; } for(i=0;ilmore;i++){ if(rt->pmore[i]min
15、
16、rt->pmore[i]>rt->max){ return-1; } if(rt->ptms[i]<1){ return-1; } }
17、 //获取扩展最大值 exmax=rt->max-rt->min+1; for(i=0;iltms;i++){ exmax+=rt->ptms[i]-1; } //获取bufsz个随机数 srand(time(NULL)); //初始化随机数发生器 for(i=0;i
此文档下载收益归作者所有