收藏 分销(赏)

非等概率随机.doc

上传人:pc****0 文档编号:7486432 上传时间:2025-01-06 格式:DOC 页数:5 大小:36KB 下载积分:10 金币
下载 相关 举报
非等概率随机.doc_第1页
第1页 / 共5页
非等概率随机.doc_第2页
第2页 / 共5页


点击查看更多>>
资源描述
非等概率随机     对一序列数字随机时一般都是等概率的,但有时候希望某些数字出现的可能性更高一些。下面是本人实现的一个非等概率随机函数,可以对序列中多个数字设置不同的出现频率。限于编码水平,如有需要改进之处敬请指点. /****************************rand_seting.h********************************/ #ifndef RAND_SETING_H #define RAND_SETING_H #include <stdlib.h> #include <time.h> /*  *    随机条件结构:  *    定义min到max之间个数字出现的频率,默认为1次.  *    如果希望某些数字出现频率大于1次,则把这些数字存入数字集(由pmore指向),  *    对应的出现频率存入频率集(由ptms指向),这两个缓冲区由用户定义及设置,  *    lmore和ltms分别为对应的缓冲区长度,建议两缓冲区长度相等,允许ltms > lmore,  *    但绝不允许ltms < lmore,因为这将导致尾部数据读取非频率集缓冲区.  *  *    如:对1到20之间的数字随机,希望3出现的频率为5; 7为10; 15为20;其余数字为默认值1  *    则结构的设置为:  *    min = 1; max = 20;  *    pmore指向的缓冲区为 {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  */ struct rd_dat{      long     min;    // 起始值      long     max;    // 终止值      long     *pmore;    // 高频率数字集      long     lmore;    // 数字集长度      long     *ptms;    // 高频率数字对应的频率集(出现次数)      long     ltms;    // 频率集长度 }; /*  *    结构初始化  *    返回值:结构指针  */ struct rd_dat *rdinit(struct rd_dat *rt, long min, long max,                 long *pm, long lm, long *pt, long lt) {     rt->min = min;     rt->max = max;     rt->pmore = pm;     rt->lmore = lm;     rt->ptms = pt;     rt->ltms = lt;     return rt; } /*  *    获取随机数,存放在bufret数组中,个数为数组长度bufsz  *    返回值: 出现非法数据返回-1;否则成功返回,值为获取到随机数的个数(bufsz)  */ int rdget(const struct rd_dat *rt, long *bufret, long bufsz) {     long     rval, exmax = 0;     long     i, j, tmp;           // 验证数据的合法性      if (rt->min > rt->max || rt->lmore != rt->ltms || bufsz < 1){           return -1;      }      if (rt->pmore == NULL || rt->ptms ==NULL || bufret ==NULL){           return -1;      }      for (i = 0; i < rt->lmore; i++){           if (rt->pmore[i] < rt->min || rt->pmore[i] > rt->max){                return -1;           }           if (rt->ptms[i] < 1){            return -1;           }      }       // 获取扩展最大值      exmax = rt->max - rt->min + 1;      for (i = 0; i < rt->ltms; i++){           exmax += rt->ptms[i] - 1;      }       // 获取bufsz个随机数      srand(time(NULL));             // 初始化随机数发生器      for (i = 0; i < bufsz; i++){           rval = rand() % exmax + rt->min;           if (rval <= rt->max){     // 位于min与max之间的随机数                bufret[i] = rval;                continue;           }            // 大于max的随机数(即:出现频率高的数)           tmp = rt->max;           for (j = 0; j < rt->ltms; j++){                tmp += rt->ptms[j] - 1;                if (tmp >= rval){                 bufret[i] = rt->pmore[j];                 break;                }           }      }       return bufsz; } #endif
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服