日期:2014-05-20  浏览次数:20774 次

JAVA 有规则的不重复排列 请教各位。?
有三组数字 
A组 1,4,8,11,15,18
B组 2,5,9,12,13,16
C组 3,6,7,10,14,17
然后从每一组里面取出一个数 组成一组号码 例如 1 2 3 又例如1,5,7
A组和B组的号码可以互换 而C组不能互换 
我的办法是通过将这些数字放到RANDOM里面随机 但是JAVA的伪随机码我不知道他的规律是什么 所以好像还是要自己写一个有规律而且又不能让人看出来 这其中规律的 好比第一次出现了123 那么在1000次之后在重新回到123这个数都可以 但是最起码不能第一次123 第10次又回来123这个数字排列上。

------解决方案--------------------
你还是用java的随机数吧,弄一个hashtable,每次随机产生一个组合就往里放,一直等放到1000个。

这时候hashtable中存在1000各不重复的组合,然后你把这些组合全部放到list中,

重复遍历这个list中不就是你要的随机且有规律吗?


------解决方案--------------------
这个链接里问题的答案可以作为本帖问题的先导
http://topic.csdn.net/u/20090814/01/bc7b70ff-d6ca-409f-bde1-cc89515ceb3b.html

借用下里面的方法应该可以满足需求

Java code
public class Test {
    public static void main(String[] args) {
        int[] a={1,4,8,11,15,18};
        int[] b={2,5,9,12,13,16};
        int[] c={3,6,7,10,14,17};
        for(int i=0;i<100;i++){
            int num=nextInt(i);
            System.out.println(a[num/100%6]+","+b[(num/10)%10%6]+","+c[num%10%6]);
        }
    }
    //以下方法作者为bigbug9002
    private static int nextInt(int index){
        if(index<0){
            throw new IllegalArgumentException("num must be positive number."); 
        }
        double x=Math.abs(Math.cos(Math.sqrt(2)*(index+1)));
        double y=1.0*137/13/(index+1);
        double z=17*index*index+29*index+67;
        y=y-(int)y;
        while(y*10<1) y*=10;
        while(z>1) z/=7;
        x=x*z+y;
        String str=String.valueOf(x);
        str=str.substring(2);
        int start=index%13;
        return Integer.parseInt(str.substring(start,start+3));    
    }
}