题目:
有1~100个号码,抽取7个号码获奖。不能抽取重复的号码解题思路:
常规思路:
1.用Math.random()方法抽取一个数来
2.判断这个数是否已被抽取过,若是则重新抽取。书上思路:
用一数组存放100个数
int n = 100;
int[] number = new int[n]
for(int i=0;i<n;i++)
number[i]=i+1;再用一数组存放结果
int[] result = new int[7];随机抽取7个数将结果号码放到result数组中,并判断重复
for(int i=0;i<7;i++)
{
index=Math.random()×n;
result[i]=number[index];
number[index]=number[--n];//把已经抽到的号码和最后一个数交换,并且在算随机数时不包含最后数的索引值就实现了判断重复
}
-----------------------------
本人刚学习JAVA一星期,有什么地方请各位大侠多指点~
有1~100个号码,抽取7个号码获奖。不能抽取重复的号码解题思路:
常规思路:
1.用Math.random()方法抽取一个数来
2.判断这个数是否已被抽取过,若是则重新抽取。书上思路:
用一数组存放100个数
int n = 100;
int[] number = new int[n]
for(int i=0;i<n;i++)
number[i]=i+1;再用一数组存放结果
int[] result = new int[7];随机抽取7个数将结果号码放到result数组中,并判断重复
for(int i=0;i<7;i++)
{
index=Math.random()×n;
result[i]=number[index];
number[index]=number[--n];//把已经抽到的号码和最后一个数交换,并且在算随机数时不包含最后数的索引值就实现了判断重复
}
-----------------------------
本人刚学习JAVA一星期,有什么地方请各位大侠多指点~
那只是把最后的数赋给抽到的数吧,貌似他们没有交换
用数组存放这100个号码(他们不应该出现重复).
用length为7的数组存放重奖号码的角标.
每生成一个角标(1~100), 就判断一下有没有重复.
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
System.out.print("How many numbers doyou need to draw?");
int k = in.nextInt();
System.out.print("What is the highest number you can draw");
int n = in.nextInt();
int[] numbers = new int[n];
for (int i = 0; i < numbers.length; i++)
numbers[i] = i + 1;
int[] result = new int[k];
for (int i = 0; i < result.length; i++) {
int r = (int) (Math.random() * n);
result[i] = numbers[r];
numbers[r] = numbers[n - 1];
n--;
}
Arrays.sort(result);
System.out.println("Bet the following combination.I will male you rich!");
for (int r : result)
System.out.println(r); }}
result[i]=number[--index];
number[--index]=number[--n];
这样就行了
根本就不用抽到100
index=(int)Math.random()×n;
这个要处理一下还有 那个是没交换,只是把末尾的数覆盖掉了抽到的数
每次抽一数,然后到那BOOLEAN数组看是否被到过就可以了觉得这种方法跟简单
这个不是下标嘛,不是可以取到 number[99] 不就是最后一个数了?这个算法我还是没有明白,如果第一次就取到index=99,那还怎么交换啊