基于当前值的加权随机性(不确定如何解释)
Weighted randomness based on current values (Not sure how else to explain it)
需要一些代码方面的帮助 (Java)
我有一个每隔几分钟运行一次的脚本
此脚本创建和删除对象
为了这个例子,我想在任何时候平均有 10 个对象
但是它创建和删除对象的随机概率取决于它与具有硬限制的 10 个目标的距离,例如 +- 3
我已经让它创建对象直到它达到 7,然后一旦超过 13 就删除
但是我不知道如何在
之间做随机性
如果有 8 个对象,那么创建而不是删除的可能性更高,如果有 10 个,那么它是 50/50 拆分
如果有 12 那么它更有可能删除然后创建
我不是要代码,我很乐意自己弄明白
我只需要朝正确的方向推动
编辑以更新我目前拥有的内容,我没有完整的代码,因为还有很多其他事情正在进行,但这是我需要帮助的部分
每分钟运行一次
int limit = F_Config.get().getInt("Limit");
int avg = F_Config.get().getInt("Average");
int current = P_Player.ReturnList().size();
int min = avg - limit;
int max = avg + limit;
//below min
if(current < min) {
Main.sendConsole("Min");
P_Player.LoginPlayer();
}
//above Max
else if(current > max) {
Main.sendConsole("Max");
P_Player.LogoutPlayer();
}
//Between min and Max
else{
//Stuff here
}
首先你要弄清楚算法,之后如何实现(java)就是另外一回事了。
有 2 个操作:[添加] 和 [删除],您必须根据某些标准定义概率。
说:
[对象,AddP,DeleteP]
- [0,1,0] -> 唯一的选择是添加
- [1 到 n, a, 1-a] ,例如:[1-9, 0.75, 0.25]
- [n+1, m, b, 1-b] ,例如:[10-15. 0.3, 0.7]
- [m+1, 0, 1] ,例如:[16, 0, 1] -> 唯一的选择是删除
在[2]和[3]上只是生成一个随机数并与a,b概率比较并选择一个操作。
例如:[2] 随机 = 0.60<0.75 => 添加等
注:0 < a < 1(同b)
import java.util.ArrayList;
import java.util.List;
public class Prob
{
List<PSet> l = new ArrayList<PSet>();
List<MyObj> obj = new ArrayList<MyObj>();
@SuppressWarnings("unchecked")
public static void main(String args[])
{
Prob p = new Prob();
PSet ps1 = p.new PSet(0,0,1,0);
PSet ps2 = p.new PSet(1,3,0.8,0.2);
PSet ps3 = p.new PSet(4,5,0.3,0.7);
PSet ps4 = p.new PSet(6,6,0,1);
p.l.add(ps1);
p.l.add(ps2);
p.l.add(ps3);
p.l.add(ps4);
//loop 20 times
for(int i=0;i<20;i++)
{
int counter = p.obj.size();
for(int j=0;j<p.l.size();j++)
{
PSet ps = p.l.get(j);
if(counter == 0 && counter == ps.start)
{
System.out.println(i+"_only_add, counter="+counter);
p.obj.add(p.new MyObj(String.valueOf(i)));
}
else if(counter > 0 && counter == ps.start && counter == ps.end)
{
System.out.println(i+"_only_del, counter="+counter);
p.obj.remove(0);
}
else if(counter>=ps.start && counter<=ps.end)
{
double rand = Math.random();
if(rand<ps.pAdd)
{
System.out.println(i+"_add, counter="+counter);
p.obj.add(p.new MyObj(String.valueOf(i)));
}
else
{
System.out.println(i+"_del, counter="+counter);
p.obj.remove(0);
}
}
}
}
}
class MyObj
{
String name;
MyObj(String name)
{
this.name = name;
}
}
class PSet
{
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
public double getpAdd() {
return pAdd;
}
public double getpDel() {
return pDel;
}
int start;
int end;
double pAdd;
double pDel;
PSet(int start, int end, double pAdd, double pDel)
{
this.start = start;
this.end = end;
this.pAdd = pAdd;
this.pDel = pDel;
}
}
}
输出:
0_only_add, counter=0
1_add, counter=1
2_add, counter=2
3_add, counter=3
4_del, counter=4
5_add, counter=3
6_del, counter=4
7_add, counter=3
8_del, counter=4
9_add, counter=3
10_del, counter=4
11_add, counter=3
12_del, counter=4
13_add, counter=3
14_add, counter=4
15_add, counter=5
16_only_del, counter=6
17_del, counter=5
18_del, counter=4
19_del, counter=3
需要一些代码方面的帮助 (Java)
我有一个每隔几分钟运行一次的脚本 此脚本创建和删除对象
为了这个例子,我想在任何时候平均有 10 个对象
但是它创建和删除对象的随机概率取决于它与具有硬限制的 10 个目标的距离,例如 +- 3
我已经让它创建对象直到它达到 7,然后一旦超过 13 就删除 但是我不知道如何在
之间做随机性如果有 8 个对象,那么创建而不是删除的可能性更高,如果有 10 个,那么它是 50/50 拆分 如果有 12 那么它更有可能删除然后创建
我不是要代码,我很乐意自己弄明白 我只需要朝正确的方向推动
编辑以更新我目前拥有的内容,我没有完整的代码,因为还有很多其他事情正在进行,但这是我需要帮助的部分
每分钟运行一次
int limit = F_Config.get().getInt("Limit");
int avg = F_Config.get().getInt("Average");
int current = P_Player.ReturnList().size();
int min = avg - limit;
int max = avg + limit;
//below min
if(current < min) {
Main.sendConsole("Min");
P_Player.LoginPlayer();
}
//above Max
else if(current > max) {
Main.sendConsole("Max");
P_Player.LogoutPlayer();
}
//Between min and Max
else{
//Stuff here
}
首先你要弄清楚算法,之后如何实现(java)就是另外一回事了。
有 2 个操作:[添加] 和 [删除],您必须根据某些标准定义概率。
说: [对象,AddP,DeleteP]
- [0,1,0] -> 唯一的选择是添加
- [1 到 n, a, 1-a] ,例如:[1-9, 0.75, 0.25]
- [n+1, m, b, 1-b] ,例如:[10-15. 0.3, 0.7]
- [m+1, 0, 1] ,例如:[16, 0, 1] -> 唯一的选择是删除
在[2]和[3]上只是生成一个随机数并与a,b概率比较并选择一个操作。 例如:[2] 随机 = 0.60<0.75 => 添加等
注:0 < a < 1(同b)
import java.util.ArrayList;
import java.util.List;
public class Prob
{
List<PSet> l = new ArrayList<PSet>();
List<MyObj> obj = new ArrayList<MyObj>();
@SuppressWarnings("unchecked")
public static void main(String args[])
{
Prob p = new Prob();
PSet ps1 = p.new PSet(0,0,1,0);
PSet ps2 = p.new PSet(1,3,0.8,0.2);
PSet ps3 = p.new PSet(4,5,0.3,0.7);
PSet ps4 = p.new PSet(6,6,0,1);
p.l.add(ps1);
p.l.add(ps2);
p.l.add(ps3);
p.l.add(ps4);
//loop 20 times
for(int i=0;i<20;i++)
{
int counter = p.obj.size();
for(int j=0;j<p.l.size();j++)
{
PSet ps = p.l.get(j);
if(counter == 0 && counter == ps.start)
{
System.out.println(i+"_only_add, counter="+counter);
p.obj.add(p.new MyObj(String.valueOf(i)));
}
else if(counter > 0 && counter == ps.start && counter == ps.end)
{
System.out.println(i+"_only_del, counter="+counter);
p.obj.remove(0);
}
else if(counter>=ps.start && counter<=ps.end)
{
double rand = Math.random();
if(rand<ps.pAdd)
{
System.out.println(i+"_add, counter="+counter);
p.obj.add(p.new MyObj(String.valueOf(i)));
}
else
{
System.out.println(i+"_del, counter="+counter);
p.obj.remove(0);
}
}
}
}
}
class MyObj
{
String name;
MyObj(String name)
{
this.name = name;
}
}
class PSet
{
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
public double getpAdd() {
return pAdd;
}
public double getpDel() {
return pDel;
}
int start;
int end;
double pAdd;
double pDel;
PSet(int start, int end, double pAdd, double pDel)
{
this.start = start;
this.end = end;
this.pAdd = pAdd;
this.pDel = pDel;
}
}
}
输出:
0_only_add, counter=0
1_add, counter=1
2_add, counter=2
3_add, counter=3
4_del, counter=4
5_add, counter=3
6_del, counter=4
7_add, counter=3
8_del, counter=4
9_add, counter=3
10_del, counter=4
11_add, counter=3
12_del, counter=4
13_add, counter=3
14_add, counter=4
15_add, counter=5
16_only_del, counter=6
17_del, counter=5
18_del, counter=4
19_del, counter=3