Java 随机值如何以给定的概率分布?
对于AI,我使用随机值来决定下一步要执行的操作(只有在没有基于规则的操作时)。有些行动应该比其他行动更频繁地选择 其思想是定义一组概率,并从probs 2中选择一个动作的频率是1的两倍,而动作4的概率是1的五倍Java 随机值如何以给定的概率分布?,java,algorithm,math,language-agnostic,probability,Java,Algorithm,Math,Language Agnostic,Probability,对于AI,我使用随机值来决定下一步要执行的操作(只有在没有基于规则的操作时)。有些行动应该比其他行动更频繁地选择 其思想是定义一组概率,并从probs 2中选择一个动作的频率是1的两倍,而动作4的概率是1的五倍 action prob 0 1 1 2 (twice as often than 1) 2 2 3 2 4 5 (5 times morer often than 1) 对于这种行为,是否有一种众所周知的算
action prob
0 1
1 2 (twice as often than 1)
2 2
3 2
4 5 (5 times morer often than 1)
对于这种行为,是否有一种众所周知的算法或更为数学化的方法
我的测试实现有点笨拙。我宁愿避免内部循环
public static void main(String[] args) {
int[] counts = new int[5];
int[] props = { 1 ,2 ,2 ,2 ,5 };
int sum = 0;
for (int i = 0; i < props.length ; i++) {
sum += props[i];
}
for ( int i = 0 ; i < 100 ; i++ ) {
int rand = (int) (Math.random() * sum);
for ( int j = 0 ; j < props.length ; j++ ) {
if ( rand - props[j] <= 0 ) {
counts[j] = counts[j] + 1;
}
}
}
for ( int j = 0 ; j < props.length ; j++ ) {
System.out.println( "count " + j + "=" + counts[j] );
}
}
您希望解决以下等式:
p0 + p1 + p2 + p3 + p4 = 1
p0 = p
p1 = 2p
p2 = 2p
p3 = 2p
p4 = 5p
这是一组线性方程组,可以很容易地用线性代数求解
在本例中:
p + 2p + 2p + 2p + 5p = 1
12p = 1
p = 1/12
p0 = 1/12
p1 = p2 = p3 = 2/12
p5 = 5/12
您可以在[0,1)
x中使用一个均匀分布的数字,通过设置数组来选择发生的事件:
aux[0] = 0
aux[i] = aux[0] + p_{i-1}
在你的例子中:
aux = [0,1/12,3/12,5/12,7/12,1]
然后,为
x
绘制一个值,并在i
上进行二进制搜索,以找到高于x
的最接近的值,这就是您的事件。您正在寻找方程的解:
p0 + p1 + p2 + p3 + p4 = 1
p0 = p
p1 = 2p
p2 = 2p
p3 = 2p
p4 = 5p
这是一组线性方程组,可以很容易地用线性代数求解
在本例中:
p + 2p + 2p + 2p + 5p = 1
12p = 1
p = 1/12
p0 = 1/12
p1 = p2 = p3 = 2/12
p5 = 5/12
您可以在[0,1)
x中使用一个均匀分布的数字,通过设置数组来选择发生的事件:
aux[0] = 0
aux[i] = aux[0] + p_{i-1}
在你的例子中:
aux = [0,1/12,3/12,5/12,7/12,1]
然后,为
x
绘制一个值,并在i
上进行二进制搜索,以找到比x
更高的最近值,这就是您的事件。使用这些值的数组如何,更常见的值出现得更频繁:
int[] actions = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4} // 12 values.
你就可以这么做了
int action = actions[Math.random() * actions.length]
获取加权随机操作。一个具有值的数组如何,更常见的值出现的频率更高:
int[] actions = {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4} // 12 values.
你就可以这么做了
int action = actions[Math.random() * actions.length]
获取加权随机操作。我认为洗牌
操作
元素将提供更好的加权分布。这其实并不重要,因为Math.random()是均匀分布的,对吗?当然可以,如果你想的话。这取决于你需要多精确的随机。它不是真的不符合形式,线性同余生成器也不是最精确的选择。你可能会发现这很有趣:可能有点吹毛求疵,那就是:)我对答案投了高票。你打算如何洗牌操作,anyways?难道你不需要使用Math.random()吗?我认为洗牌动作元素会得到更好的加权分布。这其实并不重要,因为Math.random()是是均匀分布的,对吗?当然可以,如果你想的话。这取决于你需要多精确的随机。它不是真的不符合形式,线性同余生成器也不是最精确的选择。你可能会发现这很有趣:可能有点吹毛求疵,那就是:)我对答案投了高票。你打算如何洗牌操作,anyways?你不需要使用Math.random()吗?