算法题,获取随机不重复数组

来源:互联网 发布:蒙元 知乎 编辑:程序博客网 时间:2024/05/13 17:12

搞.NET#才一年,有空就补习数据结构和算法,最近试着写了一个获得随机不重复数组的小算法不知道对错,希望各位大大指点。。
比如任意数组n位,用的random类实例方法ran.next(N),如果可能N无限接近n?本人菜鸟只会用c#里的random类

貌似我测试是可以成功的,还有其他的方法或者思路吗。。没看出有啥不同的。你自己的这个checkTi效率应该也不会很高。

顶起。。之前看简单选择排序的时候感觉2层循环也能实现,那时候我能想出来的2个办法是:1.把随机数组生成的过程放到循环里;2.按照我上面的思路,先生成随机数组,再通过算法动态修改数组来实现。
嗯思路不太好吧。只是学习了几个基本的算法。希望能抛砖引玉

没随即一个数,存入数组,再次随即的 看数组里面有没有重复的,没有就加入数组,以此类推

如果最大随机数值上限远大于数组长度?按照您的方法效率也许会高些?因为碰到随机不重复数的几率也大。

不太明白楼主的意思,上面写的代码不知道是不是你想要的效果....

呵呵"比如任意数组n位,用的random类实例方法ran.next(N),如果可能N无限接近n?"...
你可以试一试当数组长度30000的时候,N的值尽可能接近n时,假设N=n+1,结果会如何?
你的数组长度是20,int intMax=100 intmax/i = 5倍! 在数目较小的时候会很快吧。

刚刚试过了,如果随机数为数组length+1,就如上图循环了那么久,如果是等于length,汗~~~~ 等了10分钟都还没出

呵呵 事实证明要考虑最极端的情况数组长度=最大随机数值
用数学归纳法可以得到概率,数组长度为N,最大随机数值为N
最糟的概率k=1*(n-1/n)*(n*2/n)*...*(1/n)=n!/(n的n次方),最糟次数:(n的n次方)/n!
额。。我现在只觉得概率是这样,刚刚那个归纳的次数不对头,运气好的话次数很少,但也许是很恐怖的天文数字。

请问能说说集合的方法吗,还有13楼那种还真没用过。。

random.nextInt() 返回16位随机整型数吗?不懂JAVA。。貌似是个办法

额,楼上的朋友这种情况要考虑不使用伪随机数?补充请教生成完全随机数的方法。。

同意楼上。应该生成一个,检查一下,再决定是否放入。你这样生成——放入——检验——重放入,很明显,至少第一个放入是浪费的。

n比较接近N的时候,还不如用洗牌算法把N个数的次序打乱,然后取前n位

这个和我帖子的算法有点相似吧,先生成随机数组不过我是替换。。这种思路和6楼以及8楼的方法到底哪种比较适合呢?另外List<t>提供的方法对算法的效率能起到多大的提高?
期望的要求:
N比较大(我的机器跑的是N=30000,所需时间不到大部分都在30S内,但是波动比较大)。
array.length和N无限相近。
算法执行所需平均时间和所生成的总随机数(产生相同的随机数就是费随机数)的平均次数(作废的次数也要算在其中)尽可少。
只需要用一个HashSet验证重复的问题,有必要被弄成这么复杂么?

放到一个List中,取随机数n=[0-list.size),然后list.remove(n),这样取出来的肯定不会重复,验证都不用了
如果要取下标,就把数组所有下标放到list中,取一个随机数移除一个。然后用移除的下标到数组中去取

严重同意,这么强大的Hash大法不用,循环来循环去的累不累。

不知道我的机器跑下地会如何。。不过顶你;还要谢谢42楼的辛劳工作。。算法已经收录研究ing..

性能应该不错,但是就像43楼说的那样会出现那些局限,但是话说,30亿个数也才500mb的空间嘛,还算好啦

HashTable没用过,以前到时试验将数组放入字典中,因为Key值是唯一的,所以容易检测重复值,其他的应该也是这个原理
对于现在的.NET FW来说。。。算法神马的都是浮云,如果太固守会遭人鄙视的(早知道如此就放C语言区了。。)
要做到不重复很容易,初始化数组的N个元素为1...N,然后从1开始随机交换1...N里面的任何一个值,交换N次后就OK
来源:英超直播

原创粉丝点击