概述
class Solution {
//大致的思路:先按照各个数的权重生成一个权重之和数组,例如[1,2,3,4]生成的权重之和数组就是[1,3,6,10],假设我们生成的数为random(0,10)中的一个整数
//如果该数为0直接返回0,如果生成的数是1,2我们直接返回1,如果生成的数是3,4,5我们直接返回2,如果生成的数是6,7,8,9我们直接返回3
//每一个数组的下标对应它的权重个随机数,那么随机数怎么对应到相应的数组下标呢,我们发现数组我们生成的税基数和[1,3,6,10]有着这样的关系,当生成的随机数小于数组中对应的数并且大于等于其前一个数时就选择这个下标,由于这个数组是一个递增排序的数组对于这样的数组我们可以使用二分法来寻找这样一个数
private int sum[];
private int total;
//按照w数组生成权重之和数组
public Solution(int[] w) {
sum = new int[w.length];
int sumi = 0;
for(int i = 0;i < w.length;i++){
sumi += w[i];
sum[i] = sumi;
}
total = sumi;
}
//按照权重生成随机数
public int pickIndex() {
//生成权重大小的随机数
Random random = new Random();
int p = random.nextInt(total);
//随机数在sum数组中二分查找
//确定二分的起始位置
int left = 0;
int right = sum.length - 1;
//开始二分查找,需要注意的是left == right的位置仍然需要一次二分查找
while(left <= right){
//确定二分中件位置
int mid = (left + right)/2;
//随机数大于等于mid位置,直接甩掉左边
if(p >= sum[mid]){
left = mid + 1;
}else{
//随机数如果大于mid位置,继续比较左边的位置是否比它小,如果小直接返回,这需要注意如果已经是最左边一个元素直接返回
if(mid == 0 || (sum[mid - 1] <= p)){
return mid;
}
//如果左边位置比它大甩掉右半边
right = mid - 1;
}
}
return - 1;
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(w);
* int param_1 = obj.pickIndex();
*/
最后
以上就是幸福柜子为你收集整理的按权重生成随机数java实现的全部内容,希望文章能够帮你解决按权重生成随机数java实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复