您的位置:首页 > 其它

不重复随机数列生成算法2-数组有效位置的最后一个元素移动到当前位置

2016-05-13 17:28 731 查看
假设n=4



第一轮,我们随机获得2时,我们不将2从数组中移除,而是将数组的最后一个元素移动到2的位置



这时数组变成了



第二轮我们对0-2取随机数,这时数组可用的最后一个元素位置已经变成了2,而不是3。假设这时取到随机数为1

我们再把下标为2的元素移动到下标1,这时数组变成了



以此类推,直到取出n个元素为止。

这个算法的优点是不需要用一个hashtable来存储已获取的数字,不需要反复尝试,也不用像上一个算法那样删除数组元素,要做的只是每次把数组有效位置的最后一个元素移动到当前位置就可以了,这样算法的复杂度就降低为O(n),速度大大提高。

经测试,在n=100000时,这个算法的用时仅为7ms。

下面给出这个算法的实现代码

///<summary>

///Designedbyeaglet

///</summary>

///<paramname="total"></param>

///<returns></returns>

publicstaticint[]GetRandomSequence2(inttotal)

{


int[]sequence=newint[total];

int[]output=newint[total];


for(inti=0;i<total;i++)

{

sequence[i]=i;

}


Randomrandom=newRandom();


intend=total-1;


for(inti=0;i<total;i++)

{

intnum=random.Next(0,end+1);

output[i]=sequence[num];

sequence[num]=sequence[end];

end--;

}


returnoutput;

}


下面是n等于1万,10万和100万时的测试数据,时间单位为毫秒。从测试数据看GetRandomSequence2的用时和n基本成正比,线性增长的,这个和理论上的算法复杂度O(n)也是一致的,另外两个算法则随着n的增大,用时超过了线性增长。在1百万时,我的算法比用hashtable的算法要快10倍以上。

100001000001000000
GetRandomSequence05441075
GetRandomSequence1111038124205
GetRandomSequence21782
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: