作者ninteen (小美)
看板java
标题Re: [问题] 乐透不能重复问题
时间Sat Dec 6 02:22:57 2008
※ 引述《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]);
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 69.91.131.148
※ 编辑: ninteen 来自: 69.91.131.148 (12/06 02:23)
1F:推 yyc1217:第一次选的范围是46个数字,第二次选的范围是45个数字 12/06 23:21
2F:推 yyc1217:以此类推 12/07 00:48
3F:推 ogamenewbie:用 List 叫 Collections.shuffle 12/07 01:49
4F:推 janyfor:(int) Math.random() * 100 % 46 虽然这样相对慢了点... 12/07 02:25
5F:推 ogamenewbie:刚还没看到 Math.random.. 为什麽不用 Random nextInt 12/07 04:33
6F:推 etman395:为什麽//numbers[pick] = numbers[i];後 数字就会重覆? 12/08 00:53
7F:推 janyfor:楼上 因为那样不是两数交换 而是直接覆盖过去 12/08 10:53
8F:推 etman395:那为什麽pick = (int)(Math.random()*(Max-i) + i);这行 12/10 13:09
9F:→ etman395:不会出现重覆的数字?? 12/10 13:10
10F:推 janyfor:那行会出现有可能出现重复的 12/10 13:18
11F:推 janyfor:pick是阵列索引值 选过可以再被选 而阵列内容不会重复 12/10 13:22
12F:推 etman395:不会重覆?不懂= =.如果二次pick都是20 那阵列[0][1]不是 12/10 17:25
13F:推 etman395:都换到阵列[20]的值 12/10 17:28
14F:推 janyfor:第一次 a[0] = 1,a[20] = 21 交换後 a[0] = 21 a[20] = 1 12/10 20:35
15F:→ janyfor:第二次 a[1]=2 , a[20]=1 交换後 a[1]=1 , a[20]=2 12/10 20:39
16F:推 etman395:了解了= =好详细 谢谢你 高手^^ 12/10 22:23
17F:推 etman395:我有回文修了几行程式? 因为我觉得这程式结果有点小问题? 12/10 23:38
18F:→ ninteen:回 janyfor: (int) Math.random() * 100 % 46机率不平均 12/11 04:36