基于相关权重使Java随机归一化



我有一些与之相关的权重的任务:

Task1:4
Task2:10
Task3:15
Task4:1
Task5:8
Task6:3
Task7:25
Task8:12
Task9:4
Task10:12
Task11:12
Task12:10
Task13:12
Task14:20
Task15:12
Task16:12

权重的总和不一定等于100。在上述情况下,其172。

我正在使用此答案中的RandomCollection

我刚刚将以下方法添加到RandomCollection中以获取生成的地图:

public NavigableMap<Double, E> getMap() {
        return map;
    }

这是我的测试课:

package com.mypackage;
import java.util.Map;
public class App {
    public static void main(String[] args){
        RandomCollection<String> randomCollection = new RandomCollection<String>();
        randomCollection.add(4 * 1.0/172, "Task1");
        randomCollection.add(10 * 1.0/172, "Task2");
        randomCollection.add(15 * 1.0/172, "Task3");
        randomCollection.add(1 * 1.0/172, "Task4");
        randomCollection.add(8 * 1.0/172, "Task5");
        randomCollection.add(3 * 1.0/172, "Task6");
        randomCollection.add(25 * 1.0/172, "Task7");
        randomCollection.add(12 * 1.0/172, "Task8");
        randomCollection.add(4 * 1.0/172, "Task9");
        randomCollection.add(12 * 1.0/172, "Task10");
        randomCollection.add(12 * 1.0/172, "Task11");
        randomCollection.add(10 * 1.0/172, "Task12");
        randomCollection.add(12 * 1.0/172, "Task13");
        randomCollection.add(20 * 1.0/172, "Task14");
        randomCollection.add(12 * 1.0/172, "Task15");
        randomCollection.add(12 * 1.0/172, "Task16");
        for (Map.Entry<Double, String> entry : randomCollection.getMap().entrySet()){
            System.out.println(entry.getValue() + " : " + entry.getKey());
        }
    }
}

我乘以1.0,以获得双重并划分为172以归一化。

上述程序的输出是:

Task1 : 0.023255813953488372
Task2 : 0.08139534883720931
Task3 : 0.16860465116279072
Task4 : 0.17441860465116282
Task5 : 0.22093023255813957
Task6 : 0.23837209302325585
Task7 : 0.38372093023255816
Task8 : 0.4534883720930233
Task9 : 0.47674418604651164
Task10 : 0.5465116279069767
Task11 : 0.6162790697674418
Task12 : 0.6744186046511628
Task13 : 0.7441860465116279
Task14 : 0.8604651162790697
Task15 : 0.9302325581395349
Task16 : 1.0

这是正确的吗?

我希望RandomCollection.next()Task1Task16之间返回我一个任务;但是根据其重要性或相关权重。即,如果我致电RandomCollection.next() 172次,应返回4次Task1,应返回10次Task2,等等。

权重已经标准化,因此您可以自然添加它们。

RandomCollection<String> randomCollection = 
    new RandomCollection<String>()
        .add(4,  "Task1")
        .add(10, "Task2")
        .add(15, "Task3")
        .add(1,  "Task4")
        .add(8,  "Task5")
        .add(3,  "Task6")
        .add(25, "Task7")
        .add(12, "Task8")
        .add(4,  "Task9")
        .add(12, "Task10")
        .add(12, "Task11")
        .add(10, "Task12")
        .add(12, "Task13")
        .add(20, "Task14")
        .add(12, "Task15")
        .add(12, "Task16");

累积概率看起来很正确。

最新更新