根据粒度,您可以创建包含 100、1000 或 10000 个元素的索引。假设分布 (a,b,c,d) 且 p=(10%, 20%, 30%, 40%),我们创建一个 Map:
val prob = Map ('a' -> 10, 'b' -> 20, 'c' -> 30, 'd' -> 40)
val index = (for (e <- prob;
i <- (1 to e._2)) yield e._1 ).toList
index: List[Char] = List(a, a, a, a, a, a, a, a, a, a,
b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b, b,
c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c, c,
d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d, d)
我们现在可以非常快速地选择所需概率的元素:
val x = index (random.nextInt (100))
x 现在是 40% d,10% a,依此类推。设置短,访问速度快。
这些数字甚至不需要总和为 100,但您必须计算一次范围,然后:
val max = prob.map (_._2).sum
val x = index (random.nextInt (max))