作者ninteen (小美)
看板java
标题Re: [问题] 乐透不能重复问题
时间Thu Dec 11 03:58:38 2008
※ 引述《ninteen (小美)》之铭言:
: ※ 引述《janyfor (你哪位ㄚ)》之铭言:
: : 先将所有值放到阵列
: : 依序选乱数打乱阵列
: : 再取前6个值
: : 参考参考
: janyfor的方法是比较好的
: 运算复杂度比较低
: 不过所谓打乱阵列的地方可能要修改一下
: 以下我提供程式码
: int Max = 46; //乱数的最大值
: int[] numbers = new int[Max];
: for (int i=0 ; i<Max ; i++) numbers[i]=i;//阵列初始化
: int n = 6; //你需要的乱数个数
: int pick, temp;
: for(int i=0 ; i<n ; i++){
: pick = (int)(Math.random()*(Max-i) + i);//重点在这里
: //Swapping
: temp = numbers[pick];
: numbers[pick] = numbers[i];
: numbers[i] = temp;
: }
: //Show出乱数
: for(int i=0 ; i<n ; i++) System.out.println(numbers[i]);
这个程式确实会出现0
如果不想出现0
把for (int i=0 ; i<Max ; i++) number[i]=i;
改成for (int i=0 ; i<Max ; i++) number[i]=i+1; 即可
至於Max-i这个地方是重点,不是我写错
基本精神是,取过的乱数不再取
也就是说
第一次取0~45,然後取出的乱数放到阵列的[0]的位置,一但放过去之後就不再动它
第二次取1~45,然後取出的乱数放到阵列的[1]的位置,一但放过去之後就不再动它
第三次取2~45,然後取出的乱数放到阵列的[2]的位置,一但放过去之後就不再动它
依此类推
希望这样说明有清楚
原谅我不能画图很难说明
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 24.17.240.114
※ 编辑: ninteen 来自: 24.17.240.114 (12/11 04:09)
1F:推 etman395:第一次是取0~45+1 第二次不是取0~44+1吗?? 12/11 09:20
2F:推 etman395:噗.打太快~= = 我了解那行的意思了 谢谢 12/11 09:31