如何以给定的概率传播随机值?
How can a random value be spreaded with a given probability?
对于 AI,我使用随机值来决定下一步要执行的操作(仅当没有任何基于规则的操作时)。有些动作应该比其他动作更频繁地被选择。
我们的想法是定义一组概率,然后从概率 2 中选择一个动作的频率是概率 2 的两倍,然后是概率为 1 的动作,动作 4 的概率高五倍。
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] );
}
}
根据测试 运行 它产生的结果如下:
count 0=14
count 1=25
count 2=25
count 3=25
count 4=50
您正在寻找求解方程式的方法:
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]
获得加权随机动作。
对于 AI,我使用随机值来决定下一步要执行的操作(仅当没有任何基于规则的操作时)。有些动作应该比其他动作更频繁地被选择。
我们的想法是定义一组概率,然后从概率 2 中选择一个动作的频率是概率 2 的两倍,然后是概率为 1 的动作,动作 4 的概率高五倍。
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] );
}
}
根据测试 运行 它产生的结果如下:
count 0=14
count 1=25
count 2=25
count 3=25
count 4=50
您正在寻找求解方程式的方法:
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]
获得加权随机动作。