英文:
Fair non-binary random item
问题
可以根据各自的随机值随机获取元组列表中的一个项目,并且确保公平的机会吗?
例如:
X = [(0.60, test1), (0.20, test2), (0.20, test3)]
在这种情况下,test1 有60% 的概率被选择,而其他的则有相应的概率。我尝试使用 maybe/1
,但它给我每个元素一个"二进制机会",而我希望每个列表成员都有公平的机会,如果这有意义的话。
英文:
Is it possible to get an item of a list of tuples randomly regarding its own random value with a fair share?
For example:
X = [(0.60, test1), (0.20, test2), (0.20, test3)]
In this case test1 has a 60% probability of getting chosen over the other ones.
I tried using maybe/1
but that gives me a "binary chance" over each one whereas I want a fair chance for each member of the list if that makes sense.
答案1
得分: 3
您可以轻松地根据此答案中的解决方案(其中我复制了choice/3
和choice/4
的谓词)进行如下调整:
solve:-
X = [(0.60, test1), (0.20, test2), (0.20, test3)],
findall(P,member((P,_),X),LP),
findall(T,member((_,T),X),LT),
choice(LT,LP,V),
writeln(V).
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), !.
然后调用 ?- solve
。这是一个基本的解决方案,可以改进,例如,不需要两次调用findall/2
。一个有趣的替代方法是使用概率逻辑编程,请查看它。
英文:
You can easily adapt the solution from this answer (from which i copied the predicates choice/3
and choice/4
), in this way:
solve:-
X = [(0.60, test1), (0.20, test2), (0.20, test3)],
findall(P,member((P,_),X),LP),
findall(T,member((_,T),X),LT),
choice(LT,LP,V),
writeln(V).
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), !.
And then call ?- solve
. This is a basic solution, it can be improved, for instance without calling findall/2
two times... An interesting alternative is to use probabilistic logic programming, check it out.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论