Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java博弈算法中的加权随机性_Java_Android_Andengine - Fatal编程技术网

java博弈算法中的加权随机性

java博弈算法中的加权随机性,java,android,andengine,Java,Android,Andengine,我有一个随机发生器,我想用于4个项目 我希望每个项目都有一个加权的随机性。当然,随机性最高的一个比其他的更容易被选择 我有4个项目,随机发生器可以选择 Random rand = new Random(); int itemNumber = rand.nextInt(4) + 1; 所以基本上我只想让每一件物品都有一个相对的重量。我还需要能够在整个项目生命周期中改变权重。所以每件物品的重量不是最终的。我有一个池,用于循环使用项目以节省内存,因此,当选择项目时,它将从池中提取。将权重加总,从该

我有一个随机发生器,我想用于4个项目

我希望每个项目都有一个加权的随机性。当然,随机性最高的一个比其他的更容易被选择

我有4个项目,随机发生器可以选择

Random rand = new Random();

int itemNumber = rand.nextInt(4) + 1;

所以基本上我只想让每一件物品都有一个相对的重量。我还需要能够在整个项目生命周期中改变权重。所以每件物品的重量不是最终的。我有一个池,用于循环使用项目以节省内存,因此,当选择项目时,它将从池中提取。

将权重加总,从该范围中选择一个随机数,然后按范围选择项目


如果您有4个项目,权重分别为4、3、2、1,那么您的总数为10(0-9)。0-3是第一项,4-6是第二项,7-8是第三项,9是最后一项。

将权重加在一起,从该范围中选择一个随机数,然后按范围选择项目


如果您有4个项目,权重分别为4、3、2、1,那么您的总数为10(0-9)。0-3是第一项,4-6是第二项,7-8是第三项,9是最后一项。

您可以使用如下功能。传入权重-它将返回一个介于1和传入的权重数之间的相应随机整数

public weightedRandom(int[] weights) {
    int total = 0;
    for(int i=0; i<weights.lenght; i++) {
        total += weights[i];
    }

    int nnum = rand.nextInt(total);
    for(int i=0; nnum > 0; i++) {
        nnum -= weights[i];
    }

    return i + 1;
}
公共权重随机数(int[]权重){
int-total=0;
for(int i=0;i 0;i++){
nnum-=权重[i];
}
返回i+1;
}

您可以使用如下功能。传入权重-它将返回一个介于1和传入的权重数之间的相应随机整数

public weightedRandom(int[] weights) {
    int total = 0;
    for(int i=0; i<weights.lenght; i++) {
        total += weights[i];
    }

    int nnum = rand.nextInt(total);
    for(int i=0; nnum > 0; i++) {
        nnum -= weights[i];
    }

    return i + 1;
}
公共权重随机数(int[]权重){
int-total=0;
for(int i=0;i 0;i++){
nnum-=权重[i];
}
返回i+1;
}

如果每个项目都有一个权重,那么您可以生成一个随机数0-(总和(权重)),并根据它所属的范围进行选择

例:

int-weights[]=新的int[]{1,2,3,4};
整数和=10//我在作弊,这需要计算
Random rand=新的Random();
整数选择=rand.nextInt(总和)+1;
对于(int x=0;x如果(选项-=weights[x]如果每个项目都有一个权重,那么您可以生成一个随机数0-(总和(权重)),并根据它属于哪个范围进行拾取

例:

int-weights[]=新的int[]{1,2,3,4};
int sum=10;//我在作弊,需要计算它
Random rand=新的Random();
整数选择=rand.nextInt(总和)+1;
对于(int x=0;x如果(choice-=weights[x]创建一个可能项目的arraylist,随着项目权重的变化,将更多此类项目添加到数组中,并为随机项目调用数组的随机索引。如下所示:

ArrayList<int> rand = {1,2,3,4}
//This would add more weight to the number 1
rand.add(0,1)

//then to choose a random item, just call for a random index
rand.get((int)(Math.random*rand.size())
arraylistrand={1,2,3,4}
//这将增加数字1的重量
兰德加(0,1)
//然后要选择一个随机项,只需调用一个随机索引
rand.get((int)(Math.random*rand.size())

创建一个可能项目的arraylist,随着项目权重的变化,将更多此类项目添加到数组中,并为随机项目调用数组的随机索引。如下所示:

ArrayList<int> rand = {1,2,3,4}
//This would add more weight to the number 1
rand.add(0,1)

//then to choose a random item, just call for a random index
rand.get((int)(Math.random*rand.size())
arraylistrand={1,2,3,4}
//这将增加数字1的重量
兰德加(0,1)
//然后要选择一个随机项,只需调用一个随机索引
rand.get((int)(Math.random*rand.size())

刚刚编写了一个小算法,该算法首先根据不同的权重随机选择项目,然后从这些选择的项目中进行随机选择。:)

整数权重百分比[]={50,10,20,20}

int randomPercentage =(int) (Math.floor(Math.random()*100);

int countSelected = 0;

Arraylist<Integer> selectedItems = new ArrayList<Integer>();

for(int lop=0; lop<weightPercentages.length; lop++){
     if(weightPercentage[lop]>randomPercentage)
          selectedItems.add(weightPercentage[lop]);
}

int selectedItem = (int) (Math.floor(Math.random()*selectedItems.size());

System.out.println(randomPercentage[selectedItem]);
intrandomPercentage=(int)(Math.floor(Math.random()*100);
int countSelected=0;
Arraylist selectedItems=新建Arraylist();
对于(int lop=0;lop百分比)
选择editems.add(权重百分比[lop]);
}
int selectedItem=(int)(Math.floor(Math.random()*selectedItems.size());
System.out.println(随机百分比[selectedItem]);

刚刚编写了一个小算法,该算法首先根据不同的权重随机选择项目,然后从这些选择的项目中进行随机选择。:)

整数权重百分比[]={50,10,20,20}

int randomPercentage =(int) (Math.floor(Math.random()*100);

int countSelected = 0;

Arraylist<Integer> selectedItems = new ArrayList<Integer>();

for(int lop=0; lop<weightPercentages.length; lop++){
     if(weightPercentage[lop]>randomPercentage)
          selectedItems.add(weightPercentage[lop]);
}

int selectedItem = (int) (Math.floor(Math.random()*selectedItems.size());

System.out.println(randomPercentage[selectedItem]);
intrandomPercentage=(int)(Math.floor(Math.random()*100);
int countSelected=0;
Arraylist selectedItems=新建Arraylist();
对于(int lop=0;lop百分比)
选择editems.add(权重百分比[lop]);
}
int selectedItem=(int)(Math.floor(Math.random()*selectedItems.size());
System.out.println(随机百分比[selectedItem]);

你能提供一个例子吗?谢谢你的回答。我理解你的意思,这很有道理。快速提问,我是否需要和if语句来测试每个整数是否在某个范围内,或者你会建议什么?例如,如果整数和总数发生变化,它如何知道什么范围应该是c每个协调加权项目的正确范围?你能提供一个例子吗?谢谢你的回答。我理解你的意思,这非常有意义。快速提问,我是否需要和if语句来测试每个整数是否在某个范围内,或者你会建议什么?例如,如果整数发生变化,总的变化是h,该怎么办它怎么知道每个协调加权项的正确范围是多少?我喜欢这种方法,但出于某种原因,我在负数中得到了随机数?@coder_for_Life22对不起,我在上一个
return
语句中犯了错误。我现在更新了我的答案。我喜欢这种方法,但出于某种原因,我在负数中得到了随机数s@coder_For_Life22对不起,我在上一个
return
语句中犯了错误。我现在更新了我的答案。