如何以给定的概率传播随机值?

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]

获得加权随机动作。