除了代码,重要的是分析。。我实在想不明白这个了,来求大神们帮帮忙
有三个常见的思路
(1)生成一个包含这个范围(假设范围是2-6)的数组,内容是连续序数。比如 [2,3,4,5,6]
再生成一个和它相同长度,但是里面存随机数的数组,比如[432,541,406,67,190] (实际上随机数的范围可以是1~2^31-1)
对这个数组排序,并且按照原来的顺序得到原始下标,比如排序后[67,190,406,432,541],对应原来下标是[3,4,2,0,1]也就是原来67下标是3,现在第一个元素就是3,别的类似。
最后,用这个打乱的下标,对你原始数据索引,比如3,那么就找到 [2,3,4,5,6] 的下标3的数字,也就是5,以此类推。得到[5,6,4,2,3]
[5,6,4,2,3]就是对[2,3,4,5,6]也就是你的范围打乱的结果,你要n个数,就从中依次取n个就可以了。
这个办法叫做洗牌算法,适合n和你的范围相同或者很接近的时候
两种方法,第一个将这些数正序排列,每次讲随机位置的数与第一个数调换,循环尽可能多次,然后取前n个数。第二个方法,将这个范围二分,然后将整个范围所要取得个数随机分配到两边,不断循环,直到无法再分割为止时返回取得的数,最后整合起来就是n个随机的数了。
我的想法是第一种办法允许对数据空间进行修改,而第二种不可以。不知道这些方法有没有帮到你
第二个思路,适合你取的数字远远少于范围总共的数字
方法是,建立作为结果的数组,直接生成一个范围内的随机数,然后循环遍历这个结果数组,如果没有,那么放进入,如果重复了,再生成一次,直到生成不重复的。
第三个思路,你可以将范围放在一个arraylist里面,然后随机生成一个0~arraylist长度-1的数字,取出来,放入结果数组,同时在arraylist里删除它。
重复以上过程n次,得到n个数字。
一.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机,这个在j2me中没有。
二.在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以产生随机整数、随机float、随机double,随机long,这个也是我们在j2me的程序里经常用的一个取随机数的方法。
三.在我们的System类中有一个currentTimeMillis()方法,这个方法返回一个从1970年1月1号0点0分0秒到目前的一个毫秒数,返回类型是long,我们可以拿他作为一个随机数,我们可以拿他对一些数取模,就可以把他限制在一个范围之内啦
取自:http://www.cnblogs.com/elleniou/p/3334886.html
其实楼上的答案差不多都是正确的吧,一楼的思路相对来说要好一些,但是在他的基础上,我觉得我个人的方法应该相对要简单一点。给定范围n~m,
生成数组a[m-n+1]={n...m],调用随机函数产生随机数:random.netInt(k),此处的k最初为数组大小,每取一次k值减1.例如取到3,那么第一个随机数
就是a[3],然后将a[[3]=a[k]。此方法就能保证取到没有重复的在你限定范围内的数。