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;
}