试试这个:
在此示例中,我使用了一个字符数组,但您可以将其替换为整数数组。
权重列表包含每个字符的相关概率。
它代表我的字符集的概率分布。
在每个字符的权重列表中,我存储了他的实际概率加上任何先行概率的总和。
例如在weightsum中,'C'对应的第三个元素是65:
P('A') + P('B) + P('C') = P(X=>c)
10 + 20 + 25 = 65
所以 weightsum 代表我的字符集的累积分布。
weightsum 包含以下值:
很容易看出,第8个元素对应H,有更大的差距(80当然像他的概率)那么更有可能发生!
List<Character> charset = Arrays.asList('A','B','C','D','E','F','G','H','I','J');
List<Integer> weight = Arrays.asList(10,30,25,60,20,70,10,80,20,30);
List<Integer> weightsum = new ArrayList<>();
int i=0,j=0,k=0;
Random Rnd = new Random();
weightsum.add(weight.get(0));
for (i = 1; i < 10; i++)
weightsum.add(weightsum.get(i-1) + weight.get(i));
然后我使用一个循环从 charset 中提取 30 个随机字符,每个字符都根据累积概率绘制。
在 k i 中存储了一个从 0 到 weightsum 中分配的最大值的随机数。
然后我在 weightsum 中查找一个大于 k 的数字,该数字在 weightsum 中的位置对应于 charset 中 char 的相同位置。
for (j = 0; j < 30; j++)
{
Random r = new Random();
k = r.nextInt(weightsum.get(weightsum.size()-1));
for (i = 0; k > weightsum.get(i); i++) ;
System.out.print(charset.get(i));
}
代码给出了字符序列:
HHFAIIDFBDDDHFICJHACCDFJBGBHHB
让我们算一下吧!
A = 2
B = 4
C = 3
D = 5
E = 0
F = 4
G = 1
H = 6
我 = 3
J = 2
总计:30
正如我们希望的那样,D 和 H 的出现次数更多(70% 和 80% 概率。)
否则E根本没有出来。 (10% 的可能性)