- public class RandomNumber {
- public static void main(String[] args) {
- System.out.println("How many numbers do you need to draw?");
- int k = 6;
- System.out.println("What is the highest number you can draw?");
- int n = 50;
- // fill an array with numbers 1 2 3. . . n
- int[] numbers = new int[n];
- for (int i = 0; i < numbers.length; i++) {
- numbers[i] = i + 1;
- }
- // draw k numbers and put them into a second array
- int[] result = new int[k];
- for (int i = 0; i < result.length; i++) {
- // make a random index between 0 and n - 1
- int r = (int) (Math.random() * n); // 关键在这里,*n表示每次会产生随机数的范围,每次产生的随机数范围是0~n
- // pick the element at the random location
- result[i] = numbers[r];
- // move the last element into the random location
- numbers[r] = numbers[n - 1];
- // 之所以这里把最后的元素和之前选择元素做替换,因为要把每次都会缩小随机数产生的范围,而范围缩小是通过最后一个数减小来实现的。
- n--;
- }
- // print the sorted array
- Arrays.sort(result);
- System.out
- .println("Bet the following combination,It'll make you rich!");
- for (int i = 0; i < result.length; i++) {
- System.out.println(result[i]);
- }
- }
- }
复制代码 在网上找了下,发现楼主你的代码没贴全呀。
我把源码贴过来了,你那个之所以不行,就是在于,你把源码中的变量n(控制随机数范围的变量)弄成了常量,如果这样做的话,每次随机数产生的范围都是一样大的,交换最后一个元素位置根本没意义。
如果像是源码那样,通过n的每次减小来缩小随机数产生的范围,通过交换最后一个数,可以把之前选择过的数剔除出随机数的范围,从而实现不重复。
|