Re: Challenge!
- To: mathgroup at christensen.cybernetics.net
- Subject: [mg922] Re: Challenge!
- From: Gennady <stupakov at slac.stanford.edu>
- Date: Wed, 3 May 1995 00:01:08 -0400
- Organization: SLAC
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.
>
>The function I have written to do this is:
>
> swap[list1_List, list2_List] :=
> Module[{newlist={},M},
> M = Length[list1];
> Do [AppendTo[
> newlist,
> If[Random[]>0.5, list1[[i]], list2[[i]]]
> ],
> {i, M}
> ];
> newlist
> ]
>
>which works fine, but it really isn't very elegant in terms of
Mathematica's
>functional programming style. There must be a more compact way to do
this
>in terms of Mapping functions, and so on.
>
>What is the most compact function that could achieve my goal?
>
>Paul.
>
>
Here is a shorter way to do the job:
In[18]:=
l1={a,b,c,d,e,f,g};
l2={A,B,C,D,E,F,G};
In[47]:=
swap[l1_,l2_]:=Map[Part[#,Random[Integer,{1,2}]]&,
Transpose[{l1,l2}]]//Flatten
In[48]:=
swap[l1,l2]
Out[48]=
{A, b, C, d, E, F, g}
In[49]:=
swap[l1,l2]
Out[49]=
{a, b, C, d, e, f, G}
Regards,
Gennady.