先将数字累加,然后压入数组中,由此得到一系列的区间。
只要我们产生一个随机数,看落在哪个子区间就行了。
例如,输入3,2,5
就表示产生0的可能性占3份,产生1的可能性占2份,产生2的可能性占5份,
于是产生一个数组:3,5,10
再随机生成一个数,落在[0,10)上,
判断该随机数落在哪个子区间就可以产生对应的结果了。
0:[0,3)
1:[3,5)
2:[5,10)
至于怎么判断随机数落在哪个子区间,此处给出2种方法。
线性查找,更简单
class Solution {
public:
Solution(vector<int>& w) {
for(int i=0;i<w.size();++i){
sum+=w[i];
vec_sum.push_back(sum);
}
}
int pickIndex() {
int target = rand()%sum;
int i=0;
for(;i<vec_sum.size();++i){
if(target<vec_sum[i]){
break;
}
}
return i;
}
private:
vector<int> vec_sum;
int sum=0;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(w);
* int param_1 = obj->pickIndex();
*/
二分查找,更快速
class Solution {
public:
Solution(vector<int>& w) {
for(int i=0;i<w.size();++i){
sum+=w[i];
vec_sum.push_back(sum);
}
}
int pickIndex() {
int target = rand()%sum;
return binarySearch(target,0,vec_sum.size()-1);
}
int binarySearch(int target,int left,int right){
if(left>=right)
return right;
int mid=(left+right)/2;
if(vec_sum[mid]==target)
return mid+1;
else{
if(vec_sum[mid]>target)
return binarySearch(target,left,mid);
else
return binarySearch(target,mid+1,right);
}
}
private:
vector<int> vec_sum;
int sum=0;
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(w);
* int param_1 = obj->pickIndex();
*/