Если вы хотите только один раз для каждого элемента списка, вот возможное определение (в SWI-Prolog), которое возвращает элементы при возврате:
get_random([E], E) :- !.
get_random(L, E) :-
length(L, C),
R is random(C),
length(Skip, R),
append(Skip, [X|Tail], L),
( E = X
; append(Skip, Tail, Rest),
get_random(Rest, E) ).
test:
?- get_random([a,b,c,d,e,f],X).
X = e ;
X = f ;
X = d ;
X = b ;
X = c ;
X = a.