在Prolog中,我如何從一組52個卡中隨機挑選2個值?即玩家1(X,Y),X將是52和Y中的任何一張牌,並且它們必須是不同的。玩家2將得到相同的待遇,他的牌必須與已經選擇的牌不同。謝謝。從一組常量中挑選2個隨機值
0
A
回答
1
在SWI-Prolog的我會做pick_card/3
pick_card(Cards, Card, Rest) :-
length(Cards, N), random_between(1, N, R), nth1(R, Cards, Card, Rest).
和應用它的2倍
pick_two_cards(Cards, C1,C2, Rest) :-
pick_card(Cards, C1, R1),
pick_card(R1, C2, Rest).
1
基本上,任務是採樣來自集合[1 4個不同元件.. 52。
在Python中,例如,對於這個標準的功能,而且代碼會
random.sample(range(1, 52 + 1), 4)
我看着Python中如何實現random.sample(range(1..N + 1), K)
- 它是生成隨機數的基本上只是k步[1 ..N],並在每一步只是不斷嘗試生成隨機數,而當前生成的數已經在上一步中選擇。它看起來效率不高,但可能需要對分佈的統一性進行歸檔。
讓我們爲Prolog創建一個類似的(但簡化的)sample
謂詞。
sample(N, K, Sample) :-
sample(N, K, [], Sample).
sample(_, 0, _, []).
sample(N, K, Selected, [X | Rest]) :-
K > 0,
new_random_index(N, Selected, X),
NewSelected = [X | Selected],
NewK is K - 1,
sample(N, NewK, NewSelected, Rest).
new_random_index(N, Selected, X) :-
(
% Can be implementation-specific. Works in B-Prolog and ECLiPSe CLP.
X is (random mod N) + 1,
\+ membchk(X, Selected)
;
new_random_index(N, Selected, X)
).
夫婦測試運行的:
| ?- sample(52, 4, Sample).
sample(52, 4, Sample).
Sample = [40,23,38,44] ?
yes
| ?- sample(52, 4, Sample).
sample(52, 4, Sample).
Sample = [2,28,39,17] ?
yes
程序的效率可以如果membchk
測試改變爲測試使用隸屬集,而不是列出了謂詞得到極大改善。但是這是非常具體的實現。
+0
謝爾蓋對我來說太複雜了。希望在未來的將來我能理解它。 – vincent
1
如果您想重複繪製隨機卡片,最好一次性將整個列表隨機洗牌,然後從前面挑選卡片。有些Prologs(如ECLiPSe)爲這個圖書館謂語,所以你可以只調用
lists:shuffle(Cards, [Card1,Card2|Rest]).
如果你想寫的洗牌自己,這裏是一個巧妙的方法:
shuffle(Xs, Rs) :-
add_random_keys(Xs, KXs), % add random key to each list element
keysort(KXs, KRs), % sort by keys, perturbing original order
strip_keys(KRs, Rs). % remove the keys again
add_random_keys([], []).
add_random_keys([X|Xs], [K-X|KXs]) :-
random(K),
add_random_keys(Xs, KXs).
strip_keys([], []).
strip_keys([_K-X|KXs], [X|Xs]) :-
strip_keys(KXs, Xs).
相關問題
- 1. 從異常數組中挑選一個隨機元素
- 2. jQuery從字符串數組中挑選一個隨機值
- 3. 動作2:從數組中挑選3個隨機數字
- 4. 挑選隨機值
- 5. 從Tensorflow中從另一箇中挑選隨機張量
- 6. 從MySQL中的一組數字中挑選一個隨機數
- 7. 從數組中挑選隨機數
- 8. 從數組中挑選隨機顏色
- 9. 從數組中挑選隨機NSNumber?
- 10. 從一組數字中挑選一個隨機數
- 11. CSS從數組中挑選一個隨機顏色
- 12. 從陣列中挑選一個隨機數組元素
- 13. Math.Random()挑選隨機數組
- 14. 從4個表中隨機挑選
- 15. 隨機挑選變量並賦予它們一個值AS3
- 16. 如何從Python集合中挑選2個隨機項目?
- 17. Android:隨機從2個池中挑選圖像
- 18. 格式從袋子挑選一個隨機值的關係乙
- 19. 在矢量的每N個元素中隨機挑選一個
- 20. 從數組中挑選隨機元素,但唯一
- 21. ArrayList隨機挑選
- 22. Android從指定範圍內挑選2個隨機int
- 23. 從Haskell中的文件中挑選一個隨機行
- 24. 從Ruby中的數組中挑選多個隨機值,並可能重複
- 25. 從string.xml中挑選隨機字符串
- 26. 從列表中隨機挑選
- 27. 根據概率從一系列值中隨機挑選一個數字
- 28. 球拍 - 從列表中挑選一個隨機元素
- 29. 從java中的字符串數組中挑選一個隨機項目
- 30. 從netLogo中的字符串列表/數組中挑選一個隨機元素
哇有趣enouth 。我不清楚的唯一部分是謂詞nth1。如果我沒有錯,它會將Card與發現的隨機數聯繫起來。如果是這樣,那麼爲什麼休息呢? – vincent
只是爲了保持pick_card *可重用*。添加輸入/輸出卡/休息你可以在更廣泛的範圍內重複使用。否則,只需「放棄」不需要的輸出參數 - 即所謂的投影... – CapelliC