#include<bits/stdc++.h>
using namespace std;
int main(){
default_random_engine e(time(0));
uniform_real_distribution<float> u(0,1);
float sum_weights[5]={0.1, 0.5, 0.7, 1.2, 1.5};
// 这里表示 给定的weights为[0.1, 0.4, 0.2, 0.5, 0.3], 在每个位置的累加weight
// 无需将weight归一化
for(int i=0; i< 100;i++){
float limit_begin = 0, limit_end = 1.5;
float r = u(e)*(limit_end - limit_begin) + limit_begin;
int left = 0, right = 4;
int mid;
bool finished = false;
// 使用二分法进行查找
while(left<=right && !finished){
mid = (left+right)>>1;
float interval_begin = mid==0?0:sum_weights[mid-1];
float interval_end = sum_weights[mid];
if(interval_begin<=r && r < interval_end){
finished = true;
}else if(interval_begin > r){
right = mid - 1;
}else{
left = mid + 1;
}
}
cout<<mid<<endl;
}
return 0;
}
非均匀分布的采样
最新推荐文章于 2022-08-05 10:00:00 发布