following solution should work but it uses an array so its ST is O(N) #include <stdio.h> #include <time.h> #define MAX 500 /** copied from wikipedia * */ unsigned m_w = time(NULL); /* must not be zero */ unsigned m_z = 300; /* must not be zero */
unsigned long get_random() { m_z = 36969 * (m_z & 65535) + (m_z >> 16); m_w = 18000 * (m_w & 65535) + (m_w >> 16); return (m_z << 16) + m_w; /* 32-bit result */ } // CLRS void randomize(int list[],int size){ for(int i=0;i<size;i++){ int rand = i+get_random()%(size-i); // swap int tmp = list[i]; list[i] = list[rand]; list[rand] = tmp; } } int main(){ int A[MAX]; int N,M; // assuming N<MAX , M<N scanf("%d",&N); scanf("%d",&M); for(int i=0;i<N;i++){ A[i]=i; } randomize(A,N); for(int i=0;i<M;i++){ printf("%d ",A[i]); } } On Mon, Aug 8, 2011 at 6:02 PM, Gaurav Menghani <gaurav.mengh...@gmail.com>wrote: > "The space complexity is O(1)" > > I know about hash-tables. Can you implement with O(1) space complexity? > > On Mon, Aug 8, 2011 at 10:56 AM, 석문기 <smgs2...@gmail.com> wrote: > > Box-muller method is the good solution without a lot of computation > overhead > > > > 2011/8/8 Puneet Gautam <puneet.nsi...@gmail.com> > >> > >> You may be right..we cant remove collisions in O(1) time... > >> > >> But hey, hash table is still an effective way.. > >> > >> > >> On 8/8/11, Puneet Gautam <puneet.nsi...@gmail.com> wrote: > >> > Hey avoiding collisions using hash table can be real easy : > >> > eg: > >> > if 192 is the no generated let it hash to say index 7 of hash > >> > table...so when it is again generated, it hashes to the same 7th index > >> > of hash table, but we have a non zero value already present at that > >> > index , 192 so we can reject this generated no. and proceed to the > >> > next one.. > >> > > >> > Whereas in an array , avoiding collision is a really hectic way...u > >> > need to scan all the previously generated no.s for duplicacy...well > >> > that aint gonna run in O(1) time.. > >> > > >> > So implementing hash table reduces that overhead and runs it in O(1) > >> > time..(it just has to check one if condition)....with a bigger > >> > constant. > >> > > >> > And moreover, we may even dont want an ordered sequence...just put the > >> > generated no.s in hash table as soon as they are generated...dats it.. > >> > > >> > then afterwards display that hash table.. > >> > > >> > Did u get me...? > >> > > >> > > >> > On 8/7/11, Gaurav Menghani <gaurav.mengh...@gmail.com> wrote: > >> >> We can have a sorted sequence and display them in random order, but > >> >> that is the same problem. How do we display them in random order? We > >> >> need to have a sequence of random indices, that is the same problem > as > >> >> having random numbers, isn't it. > >> >> > >> >> Moreover, I don't think collisions can be avoided in less than O(n). > >> >> We can have an efficient hash-table, but I am not sure how it can be > >> >> done in O(1) or better. > >> >> > >> >> On Sat, Aug 6, 2011 at 12:37 PM, Puneet Gautam > >> >> <puneet.nsi...@gmail.com> > >> >> wrote: > >> >>> I rhink to avoid collisions altogether we should generate an ordered > >> >>> sequence , in a dec. or inc. order and > >> >>> display them randomly, i mean: > >> >>> > >> >>> Let say a[10] contains all the random no.s , map all the 10 indexes > to > >> >>> a hash table and then display the arrays with the hashed index... > >> >>> > >> >>> I think it may work... > >> >>> > >> >>> what say..? > >> >>> > >> >>> > >> >>> On 8/5/11, Gaurav Menghani <gaurav.mengh...@gmail.com> wrote: > >> >>>> 1. Get a good seed. > >> >>>> 2. Increase the degree of the polynomial. > >> >>>> > >> >>>> This is no fixed algorithm, if you find that more than T steps have > >> >>>> passed and a new number has not been generated, you can always > change > >> >>>> the polynomial. And, please remember it is a 'pseudo-random number > >> >>>> generator'. You can read the theory about PRNGs and LFSRs, all of > >> >>>> them > >> >>>> repeat. > >> >>>> > >> >>>> On Fri, Aug 5, 2011 at 7:14 PM, payel roy <smithpa...@gmail.com> > >> >>>> wrote: > >> >>>>> How do you guarantee termination of your algorithm if duplication > >> >>>>> occurs > >> >>>>> ?? > >> >>>>> > >> >>>>> On 5 August 2011 18:25, Gaurav Menghani < > gaurav.mengh...@gmail.com> > >> >>>>> wrote: > >> >>>>>> > >> >>>>>> You might want to read the theory on Pseudo-Random Number > >> >>>>>> Generators > >> >>>>>> [0] and Linear Feedback Shift Register [1] > >> >>>>>> > >> >>>>>> The basic way of generating a random number is taking up a > >> >>>>>> polynomial, > >> >>>>>> f(x) = ax^n + bx^(n-1) + .. + yx + z, and finding f(i + seed) % > N, > >> >>>>>> where i is the ith random number you want, and seed can be > anything > >> >>>>>> random available, for example, you can find the current > millisecond > >> >>>>>> using time.h functions. > >> >>>>>> > >> >>>>>> A simple implementation, without the time thing is below: > >> >>>>>> > >> >>>>>> #include<iostream> > >> >>>>>> using namespace std; > >> >>>>>> > >> >>>>>> int poly[10],pn,N,M; > >> >>>>>> int get(int seed) > >> >>>>>> { > >> >>>>>> int t=0; > >> >>>>>> for(int i=0;i<pn;i++) > >> >>>>>> { > >> >>>>>> int res=poly[i]; > >> >>>>>> for(int j=1;j<=(i+1);j++) { res = (res*seed); > >> >>>>>> if(res>=N) > >> >>>>>> res%=N; } > >> >>>>>> t+=res; > >> >>>>>> if(t>=N) t%=N; > >> >>>>>> } > >> >>>>>> t=(t+seed); > >> >>>>>> t%=N; > >> >>>>>> return t; > >> >>>>>> } > >> >>>>>> > >> >>>>>> void setup_prng() > >> >>>>>> { > >> >>>>>> pn=5; > >> >>>>>> poly[0]=2; poly[1]=3; poly[2]=5; poly[3]=7; poly[4]=11; > >> >>>>>> N=200; M=100; > >> >>>>>> } > >> >>>>>> > >> >>>>>> int main() > >> >>>>>> { > >> >>>>>> setup_prng(); > >> >>>>>> for(int i=1;i<=M;i++) > >> >>>>>> cout<<get(i)<<endl; > >> >>>>>> return 0; > >> >>>>>> } > >> >>>>>> > >> >>>>>> Whenever there is a collision, you can increment the value passed > >> >>>>>> to > >> >>>>>> the random number generator and continue. However, I am not sure > >> >>>>>> how > >> >>>>>> to check for collisions in O(1) space. > >> >>>>>> > >> >>>>>> [0] http://en.wikipedia.org/wiki/Pseudorandom_number_generator > >> >>>>>> [1] http://en.wikipedia.org/wiki/Linear_feedback_shift_register > >> >>>>>> > >> >>>>>> On Fri, Aug 5, 2011 at 5:19 PM, payel roy <smithpa...@gmail.com> > >> >>>>>> wrote: > >> >>>>>> > Given a range 0-N, generate 'M' random numbers from the range > >> >>>>>> > without > >> >>>>>> > any > >> >>>>>> > duplication. The space complexity is O(1). > >> >>>>>> > > >> >>>>>> > -- > >> >>>>>> > You received this message because you are subscribed to the > >> >>>>>> > Google > >> >>>>>> > Groups > >> >>>>>> > "Algorithm Geeks" group. > >> >>>>>> > To post to this group, send email to > algogeeks@googlegroups.com. > >> >>>>>> > To unsubscribe from this group, send email to > >> >>>>>> > algogeeks+unsubscr...@googlegroups.com. > >> >>>>>> > For more options, visit this group at > >> >>>>>> > http://groups.google.com/group/algogeeks?hl=en. > >> >>>>>> > > >> >>>>>> > >> >>>>>> > >> >>>>>> > >> >>>>>> -- > >> >>>>>> Gaurav Menghani > >> >>>>>> > >> >>>>>> -- > >> >>>>>> You received this message because you are subscribed to the > Google > >> >>>>>> Groups > >> >>>>>> "Algorithm Geeks" group. > >> >>>>>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>>>>> To unsubscribe from this group, send email to > >> >>>>>> algogeeks+unsubscr...@googlegroups.com. > >> >>>>>> For more options, visit this group at > >> >>>>>> http://groups.google.com/group/algogeeks?hl=en. > >> >>>>>> > >> >>>>> > >> >>>>> -- > >> >>>>> You received this message because you are subscribed to the Google > >> >>>>> Groups > >> >>>>> "Algorithm Geeks" group. > >> >>>>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>>>> To unsubscribe from this group, send email to > >> >>>>> algogeeks+unsubscr...@googlegroups.com. > >> >>>>> For more options, visit this group at > >> >>>>> http://groups.google.com/group/algogeeks?hl=en. > >> >>>>> > >> >>>> > >> >>>> > >> >>>> > >> >>>> -- > >> >>>> Gaurav Menghani > >> >>>> > >> >>>> -- > >> >>>> You received this message because you are subscribed to the Google > >> >>>> Groups > >> >>>> "Algorithm Geeks" group. > >> >>>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>>> To unsubscribe from this group, send email to > >> >>>> algogeeks+unsubscr...@googlegroups.com. > >> >>>> For more options, visit this group at > >> >>>> http://groups.google.com/group/algogeeks?hl=en. > >> >>>> > >> >>>> > >> >>> > >> >>> -- > >> >>> You received this message because you are subscribed to the Google > >> >>> Groups > >> >>> "Algorithm Geeks" group. > >> >>> To post to this group, send email to algogeeks@googlegroups.com. > >> >>> To unsubscribe from this group, send email to > >> >>> algogeeks+unsubscr...@googlegroups.com. > >> >>> For more options, visit this group at > >> >>> http://groups.google.com/group/algogeeks?hl=en. > >> >>> > >> >>> > >> >> > >> >> > >> >> > >> >> -- > >> >> Gaurav Menghani > >> >> > >> >> -- > >> >> You received this message because you are subscribed to the Google > >> >> Groups > >> >> "Algorithm Geeks" group. > >> >> To post to this group, send email to algogeeks@googlegroups.com. > >> >> To unsubscribe from this group, send email to > >> >> algogeeks+unsubscr...@googlegroups.com. > >> >> For more options, visit this group at > >> >> http://groups.google.com/group/algogeeks?hl=en. > >> >> > >> >> > >> > > >> > >> -- > >> You received this message because you are subscribed to the Google > Groups > >> "Algorithm Geeks" group. > >> To post to this group, send email to algogeeks@googlegroups.com. > >> To unsubscribe from this group, send email to > >> algogeeks+unsubscr...@googlegroups.com. > >> For more options, visit this group at > >> http://groups.google.com/group/algogeeks?hl=en. > >> > > > > -- > > You received this message because you are subscribed to the Google Groups > > "Algorithm Geeks" group. > > To post to this group, send email to algogeeks@googlegroups.com. > > To unsubscribe from this group, send email to > > algogeeks+unsubscr...@googlegroups.com. > > For more options, visit this group at > > http://groups.google.com/group/algogeeks?hl=en. > > > > > > -- > Gaurav Menghani > > -- > You received this message because you are subscribed to the Google Groups > "Algorithm Geeks" group. > To post to this group, send email to algogeeks@googlegroups.com. > To unsubscribe from this group, send email to > algogeeks+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/algogeeks?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Algorithm Geeks" group. To post to this group, send email to algogeeks@googlegroups.com. To unsubscribe from this group, send email to algogeeks+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/algogeeks?hl=en.