Prolog:如何从列表中非均匀地随机选择一个元素?

时间:2018-05-09 09:44:00

标签: random prolog

有没有人有任何Prolog代码来非均匀地从列表中选择一个随机元素?

我想在给定与输入列表中每个条目相关联的概率时复制numpy.random.choice的功能。

1 个答案:

答案 0 :(得分:3)

我在library(random)中找不到任何有用的内容。

这是我的实施choice(Xs, Ps, Y)

choice([X|_], [P|_], Cumul, Rand, X) :-
    Rand < Cumul + P.
choice([_|Xs], [P|Ps], Cumul, Rand, Y) :-
    Cumul1 is Cumul + P,
    Rand >= Cumul1,
    choice(Xs, Ps, Cumul1, Rand, Y).
choice([X], [P], Cumul, Rand, X) :-
    Rand < Cumul + P.

choice(Xs, Ps, Y) :- random(R), choice(Xs, Ps, 0, R, Y).

它通过从Ps中给出的概率递归地构建cumulative probability distribution,并检查随机数R是否低于该值。

注意:要正确运行,概率Ps必须总和为1,否则不会进行检查以警告您是否属于这种情况。

示例:

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 1 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 2 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 2 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

?- choice([1,2,3], [0.1,0.2,0.7], Y).
Y = 3 .

...