MathGroup Archive 1992

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: APL, deal


Below is Richard Gayloylords functional code; then a simple Do program that
simulates it and seems to be slightly faster. Then there are two analogous
versions that list the selections in the order in which they were chosen. Again
the Do one is faster.

First,Richard's code

deal1[lis_List,n_Integer]:=
	Complement[
		lis,
		Nest[Delete[#,Random[Integer,{1,Length[#]}]]&,lis,n]
	]
	
	deal1[lis,60];//Timing
{0.8833333333333328597*Second, Null}
 
 Using Do,
 
 deal1Do[lis_List,n_Integer] :=
	Block[{rest = lis},
		 Do[
			rest = Delete[rest,Random[Integer,{1,Length[rest]}]],
		   {n}
		];		
		Complement[lis,rest]
	]
	
	deal1Do[lis,60];//Timing
	


Orderless versions.

Note the technique of accumulating nested lists and flattening at the end rather
than appending elements in the course of the computation.

dealOrderlessDo[lis_List,n_Integer] :=
	Block[{ans,rest,rand},
		{ans, rest} = {{},lis};
		 Do[
			rand = Random[Integer,{1,Length[rest]}];
			ans  = {ans,rest[[rand]]}; 
			rest = Delete[rest,rand],  
		   {n}
		];
		ans
	]//Flatten
	
dealOrderlessDo[lis,60]//Timing
{0.9833333333333325044*Second, 
  {132, 14, 51, 175, 188, 76, 187, 54, 169, 199, 5, 23, 174, 124, 109, 
   85, 1, 105, 24, 126, 58, 66, 36, 171, 34, 57, 35, 2, 127, 128, 52, 
   177, 194, 6, 141, 106, 44, 20, 153, 67, 139, 170, 179, 69, 160, 95, 
   164, 104, 129, 197, 71, 70, 84, 137, 31, 50, 159, 78, 135, 82}}
   
   
 dealOrderlessF[lis_List,n_Integer] :=
	Nest[
		{  {#1,#2[[#3]]}, 
			Delete[#2,#3], 
			Random[Integer, {1,Length[#2] -1}  ]
		}&@@#&,
			
		{{},lis,Random[Integer, {1,Length[ lis ]}]},
		
		n
		
	]//First//Flatten
	
	
dealOrderlessF[lis,60];//Timing
{1.066666666666668206*Second, Null}








  • Prev by Date: Re: Limit[FresnelC[t],t->Infinity]
  • Next by Date: Video your output
  • Previous by thread: Mma Solve[] oddity (a much shorter version)
  • Next by thread: Video your output