14号的时候老湿留了两个题目,一个是二分法,一个是彩票问题。
彩票问题有两个条件:36选7的模式,随机出来7个1~36的数字,不能有重复。
题干看似很短,但是实现起来的确需要懂点脑子,一开始我只是单纯的感觉用一个数组随机生成7个数字,然后划定范围不就OK了么,其实不然,这道题远没有我们想象中的那么简单,首先我讲一下思路。
首先用一个数列存储1~36这三十六个数字,然后用一个random变量随机出0~35(数列的下标)的数字,然后把位于这个下标的数字提取出来,作为另一个长度为7的数列的第一个下标(0),同时,把被提取出来的数字放到该数列的最后一位,然后将random变量的随机数字-1.
so let's work on it!
int[] num = new int[36];//设置一个长度为36的数列。
for(int i =1;i<=num.length;i++)
{
num[i-1]=i;//将1~36赋值给数列。
}
int[] cho = new int[7];//最后我们选择的7个数所组成的数列。
random rand = new random();//用来生成随机数以提取随机下标的random变量。
int max = 36;//一开始rand所取值的最大值。
for(int i =1;i<=cho.length;i++)//提取7个数字,循环七次。
{
int temp = rand.next(max);//在这里n不会等于35,所以可以用作num的下标使用。
cho[i-1]=num[temp];
num[temp]=num[max-1];//注意注意,在这个地方max就需要-1了,因为这里表示的是下标,不再是范围~!
max--;//每次循环结束以后,max-1表示不再随机出已经被交换的选择过的数字,从而达到不重复的效果!
}
//这样这道题的思路已经一目了然,剩下的就是做一下排序然后依次打印出来了
//接下来是冒泡排序,在上一篇文章我有提到过,现在再来熟悉一遍。
for(int i =1;i<=cho.length-1;i++)
{
for(int j =1;j<=cho.length-i;j++)
{
if(cho[j-1]>cho[j])
{
int temp = cho[j];
cho[j]=cho[j-1];
cho[j-1]=temp;
}
}
}
//这样我们就得到的规律的数列,然后我们把他打印出来,就可以去买彩票了!(不中不怪我,中奖分一半!)
for(int i =1;i<=cho.length;i++)
{
console.write("{0}\t",cho[i-1]);//一定不要忘了-1~!!!
}
大功告成,已经接近12点了,不过大晚上整理一遍思路应该会记得更清楚 嘿嘿~以后的日子更要努力了~
PS:彩票的做法不止一种,可能还有更简洁的方法,不过这个办法是大叔手把手教的T T 谢谢大叔……