Re: Challenge!

*To*: mathgroup at christensen.cybernetics.net*Subject*: [mg917] Re: Challenge!*From*: Lou D'Andria <lou>*Date*: Sun, 30 Apr 1995 03:51:40 -0400*Organization*: Wolfram Research, Inc.

In article <3nkc03$mq8 at news0.cybernetics.net> Paul E Howland, PEHOWLAND at taz.dra.hmg.gb writes: >Dear Mathgroup, > >I have two lists of equal length M. > >I wish to generate a third list also of length M, where the i th element >of this list is either the i th element of the first list, or the i th >element of the second list. > >It should be equally probable that the new element be chosen from the >first or second list. > >eg. I have a list {a,b,c,d,e,f,g} > and another {A,B,C,D,E,F,G} > >valid answers would be: > {a,B,C,d,e,F,G} > {a,b,c,d,E,f,g} > {A,B,C,D,e,f,G} > etc. [...] >What is the most compact function that could achieve my goal? Well, using Listable Plus[] and Times[], how about something like swap2[list1_List,list2_List] := list1 + (list2 - list1) Table[Random[Integer],{Length[list1]}] The use of Length[list1] can also be removed, to make it a bit more compact. swap3[list1_List, list2_List] := list1 + (list2-list1) (Random[Integer]& /@ list1) One drawback to this method is that if you wanted to choose elements from 3 or more lists, the formulas underlying the method become increasingly complex, unlike the solution posted previously swap4[list1_List, list2_List] := #[[1+Random[Integer]]]& /@ Transpose[{list1,list2}] which is easily generalized to more than two lists. swap4a[lists__] := With[{len = Length[First @ {lists}]}, #[[ Random[Integer,{1,len}] ]]& /@ Transpose[{lists}] ] Lou