Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Non-duplicate random numbers in a list

236 views
Skip to first unread message

Tim Fiedler

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
I am using AMZI prolog and I am trying to get three random numbers between 0
and 5 in a list without duplicates. Does anyone have any ideas?

rpmodell

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
Here a program which should do it. I used Trinc-Prolog because this is
my favorite Prolog development tool but I assume you can adapt it
easily for Amzi. The only predicate which is specific for Trinc-Prolog
is irand/1, which generates a random integer value between 0 and its
argument minus one.

Robert Patrick Modell


%To generate a list of 3 elements with random values between 0 and 5
%enter as goal: gen_list( 3, 5, List ).

%gen_list( +length_list, +max_random_val, ?result_list )

gen_list( Length, MaxVal, List ) :-
gen_list( Length, MaxVal, [], List ).

%Stop condition
gen_list( Length, MaxVal, List, Result ) :-
length(List, L), %Determine length of list
L >= Length, %Check if list is long enough
Result = List, %Match result variable with generated list
!. %List is long enough, use cut operator to stop

gen_list( Length, MaxVal, List, Result ) :-
RandomVal is irand(MaxVal), %List too small,generate random value
not (member(RandomVal, List)) -> %Check random value not in list
(
!,
gen_list(Length, MaxVal, [RandomVal|List], Result)
)
; (gen_list(Length, MaxVal, List, Result)).

%Determine the length of a list
length( [], 0 ) :- !.
length( [_|List], Len ) :-
length( List, Len2),
Len is Len2 + 1.

%Check if an element is a member of a list
member( X, [ X|_ ] ).
member( X, [ Y|Tail ] ) :-
member( X, Tail ).

* Sent from RemarQ http://www.remarq.com The Internet's Discussion Network *
The fastest and easiest way to search and participate in Usenet - Free!


Ray Reeves

unread,
Oct 19, 1999, 3:00:00 AM10/19/99
to
What's the problem?
go:-
L = [X,Y,Z],
repeat,
X is integer(5*random),
Y is integer(5*random),
Z is integer(5*random),
X=\=Y,
X=\=Z,
Y=\=Z,
write(L),nl.

?- go.
[4,2,0]

Ray Reeves
(Amzi support)

james_b...@my-deja.com

unread,
Oct 20, 1999, 3:00:00 AM10/20/99
to
In article <tkSO3.7887$G6.6...@news0.telusplanet.net>,

"Tim Fiedler" <ti...@telusplanet.net> wrote:
> I am using AMZI prolog and I am trying to get three random numbers
between 0
> and 5 in a list without duplicates. Does anyone have any ideas?
>
>

Here, the predicate shuffle(N, List, Result) chooses randomly N element
from the List. You can use in your case as shuffle(3, [0,1,2,3,4,5], R).


-----------------------------------------------------------------------
shuffle(N, List, Result) :-
length(List, M),
N =< M,
shuffle(N, [], M, List, Result).
shuffle(I, T, M, L, R):-
I > 0,
!,
random(M, K),
delete_nth0(L, K, H, U),
J is I - 1,
N is M - 1,
shuffle(J, [H|T], N, U, R).
shuffle(_, R, _, _, R).


delete_nth0(List, N, DeletedElement, Result) :-
delete_nth0(List, N, 0, DeletedElement,
Result).
delete_nth0([H|T], N, N, H, T) :- !.
delete_nth0([H|T], N, I, D, [H|R]) :-
J is I + 1,
delete_nth0(T, N, J, D, R).


length(L, N) :- length(L, 0, N).
length([_|T], I, N) :-
J is I + 1,
length(T, J, N).
length([], N, N).

random(M, R) :- R is integer(M * random).

-----------------------------------------------------------------------


Sent via Deja.com http://www.deja.com/
Before you buy.

0 new messages