Re: Re: Random choice
- To: mathgroup at smc.vnet.net
- Subject: [mg99854] Re: [mg99840] Re: [mg99831] Random choice
- From: Filippo Miatto <miatto at gmail.com>
- Date: Sat, 16 May 2009 05:21:13 -0400 (EDT)
- References: <200905150822.EAA18773@smc.vnet.net> <200905151026.GAA25193@smc.vnet.net>
This is superfast: a=Table[i,{i,1,500}];b={}; For[i=0,i<100,i+ + ,add = a [[RandomInteger [{1,Length[a]}]]];b=Append[b,add];a=Delete[a,Position[a,add]]] In[4]:= Length[Union[b]] Out[4]= 100 Filippo On May 15, 2009, at 12:26 PM, Leonid Shifrin wrote: > Hi Valeri, > > RandomChoice does not guarantee that all picked items (numbers) > will be > different. In v.6,0+, use RandomSample: > > In[1] = RandomSample[Range[500],100]//Short > > Out[1] = {467,487,153,196,<<92>>,65,104,399,386} > > For earlier versions, you can load Combinatorica: > > In[2] = << DiscreteMath`Combinatorica`; > > and use RandomPermutation: > > In[3] = #[[Take[RandomPermutation[#], 100]]] &@Range[500]//Short > > Out[3] = {120,122,328,6,241,<<90>>,291,58,409,314,109} > > However, both methods will become very memory-hungry if your > upper limit is large enough (more than say 10^7), due to the > necessity to > temporarily store an entire range of numbers. The used memory > will be quickly released back to the OS, of course (Mathematica > garbage > collector is quite good at this), but the peak load may be > significant. > > Here is the version from my book (slightly modified) > > ( http://www.mathprogramming-intro.org/book/node514.html ), > > which is free from this drawback. It works best when the third > optional > parameter (updatenum) is about a quarter of the total numbers asked > (n) > (this is a heuristics of course). > > > In[4] = > > Clear[randomNumsOrdered]; > randomNumsOrdered[numrange_List, n_Integer, > updatenum_Integer: 100] := > Take[NestWhile[ > Union[Join[#, RandomInteger[numrange, updatenum]]] &, > {}, Length[#] < n &], n]; > > For example, > > In[5] = randomNumsOrdered[{1, 50000000}, 100] // Timing // Short > > Out[5] = {0.,{292330,<<98>>,49669303}} > > Finally, you may do it more systematically by constructing a binary > search > tree (see Mathematica implementation, for example, in R.Maeder > "Computer > science with Mathematica") and then test each newly generated number > against > those in the tree and insert if it isn't present already. > But in practice, I doubt that this solution will be faster in > Mathematica. > > Hope this helps. > > Regards, > Leonid > > > On Fri, May 15, 2009 at 1:22 AM, Valeri Astanoff > <astanoff at gmail.com> wrote: > >> Good day, >> >> Given this example : >> >> In[1]:= RandomChoice[Range[500], 100] // Union // Length >> >> Out[1]= 91 >> >> what is the best way to get *exactly* 100 different >> random numbers ranging from 1 to 500 ? >> >> Any piece of advice would be appreciated. >> >> -- >> >> Valeri Astanoff >> >> ------------------------------------------------------------ Mobile (IT): +39 340 6104269 Mobile (NL): +31 064 3949827 Home (IT): +39 0438 59360 P.O. Box 9504 NL 2300 RA LEIDEN msn: dr.ziofil at hotmail.com skype: filippo.miatto Quantum Optics Group Mail: miatto at molphys.leidenuniv.nl
- References:
- Random choice
- From: Valeri Astanoff <astanoff@gmail.com>
- Re: Random choice
- From: Leonid Shifrin <lshifr@gmail.com>
- Random choice