问:
总共65535个端口,每次随机取一个,怎么保证每次取得和以前不一样?如果取了6万多次,后面的很容易重复,怎么优化?
答:
先用一个长度为65535的数组装有序装下1~65535。用一个变量length标记其数组长度,初始值为65535,用随机函数在[0,length)产生一个随机数,作为选取元素的下标,在抽取一个元素之后,将该元素与数组末端的最后一个元素交换,然后将数组最后一个元素扔掉,这里的扔掉,只需要将标记数组的长度的变量length-1就可以。随着比较的进行,每次被抽取的元素都被交换到了数组末端,再被扔掉,数组长度也越来越短。显然这是一个线性时间复杂度的算法。