算法题,获取随机不重复数组
2010-10-19 20:57
423 查看
搞.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
来源:英超直播
比如任意数组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
来源:英超直播
相关文章推荐
- 随机打乱一个数组,无重复的获取一定范围内的随机数
- 不重复地随机获取List或者数组元素
- 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)
- 最近常用的一个算法(生成不重复的随机数组)
- 算法随机在一定范围内(min-max)选出m个不重复的数据放到一个数组中
- js 随机获取10个不重复的1~20之间的整数数组
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。自己写的算法
- 不重复随机数列生成算法2-数组有效位置的最后一个元素移动到当前位置
- C# 获取随机数 或者随机数组 。net获取不重复的随机数或者随机数组
- 请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)
- 从一个数组中随机获取一些并不重复的数据
- C++[算法]给定一个具有100个元素的数组,请对该数组随机赋值1-100,不能出现重复的值
- js获取数组任意个不重复的随机数组元素 原创
- 产生一个不重复的随机数组(元素各不相同的随机数组)的算法
- 有一个大数组,var a = ['1', '2', '3', ...];a的长度是100,内容填充随机整数的字符串.请先构造此数组a,然后设计一个算法将其内容去重
- 关于生成不重复随机数组的问题?
- 算法研究:如何将数组中的重复数据查找出来
- 关于一道 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串