Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Algorithm_Math_Language Agnostic_Probability - Fatal编程技术网

Java 随机值如何以给定的概率分布?

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) 对于这种行为,是否有一种众所周知的算

对于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)
对于这种行为,是否有一种众所周知的算法或更为数学化的方法

我的测试实现有点笨拙。我宁愿避免内部循环

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()吗?