C语言 具有权重的随机数生成器

C语言 具有权重的随机数生成器

该函数可以按照权重表及区间表,按概率生成随机数

函数:

输入:
区间表,
权重表(注意总和为1.0),
区间数量
输出:
随机数
int Weight_rand(int interval[][2],float *weight,size_t IntervalNum)
{
	float Rand_0_1,WeightTran = 1.0;
	int ret = 0;
	Rand_0_1 = (float)rand()/(RAND_MAX+1.0); 					//在0 ~ 1.0之间随机取值
	for(size_t Num = 0; Num < IntervalNum; Num++)
	{
		WeightTran = WeightTran - weight[Num];					//将权重转置为0-1.0间的取值范围
		if(Rand_0_1 >= WeightTran)								//判断该随机数是否在取值范围中
		{
			if(interval[Num][1] - interval[Num][0] != 0)		//判断该区间表项是否为{x,x}
			return ((interval[Num][0] < interval[Num][1]) ? \
			interval[Num][0] : interval[Num][1]) + rand() % \
			(abs(interval[Num][1] - interval[Num][0])+1);		//在区间表项内取随机数
			else
			return interval[Num][0];
		}
	}
	return ret;
}

示例:

将-5 ~ -1, 0 ~ 5, 6 ~ 10, 15 ~ 20
按照0.2, 0.5, 0.2, 0.1的概率随机生成

#include<stdio.h>
#include<stdlib.h>
#include<time.h> 
#include<stdint.h>
int interval_set[4][2] = {{-5,-1},{0,5},{6,10},{15,20}};		//设置区间表
float weight_set[4] = 	   {0.2,   0.5,   0.2,   0.1};			//设置权重表 总和必须为1.0

int main()
{
	int sum[4] = {0};											//各区间总数 用于输出验证
	int RandNumber;
	int j,i,x;
	srand(time(NULL));											//伪随机数初始化
	for(j = 0; j < 100; j++)									//循环取1000次随机数并计算各区间总数
	{
		for(i = 0; i < 10; i++)
		{
			RandNumber = Weight_rand(interval_set, weight_set, 4);
			printf("%d,", RandNumber);
			for(x = 0; x < 4; x++)
			{
				if(RandNumber <= interval_set[x][1])
				{
					sum[x] ++;
					break;
				}
			}
		}
		printf("\n");
	}
	for(x = 0; x < 4; x++)										//输出各区间总数及概率
	{
		printf("sum[%d] = %d; probability = %f\n", x, sum[x], (float)sum[x]/1000);
	}
		printf("\n\n");
	
	return 0;
}
运行结果:

运行结果

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值