问题:
随机产生50个整数,位于[10,50],统计每个数字出现的次数以及出现次数最多的数字与出现次数并打印.如果出现次数为0不打印,打印时要求升序
其实问题,并不难,只是觉得有知识在其中...知识点:
1.java和其他语言产生区间数的一般规律:左包含,右不包含,即[a,b)的形式
2.java中有两种方式产生随机数Math.random(),以及Random类来产生
如何产生[10,50]的随机整数:
a.Math.random()方式产生
int a =(int) Math.random()*41;//注意是int强转,这样是截断方式转型,实际上Math.random()*41,会产生[0,41),截断转型就是[0,40]
int randomInt = a+10; // [10,50]
b.Random类产生Random random = new Random();
int randomInt = random.nextInt(41)+10;//产生一个[0,41)的整数也就是[0,40],再加上10,就是[10,50],由于是整数
这道题----只用一个一维数组的方式
package arrayWork;
import java.lang.reflect.Array;
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
/**
* array的作用
* 1. array中存放的数字代表着array[i]+10的次数。array[3]=2,就意味着13产生了2次,通过第一个for循环实现
* 2.数组与随机数之间的映射关系
*/
int[] array = new int[41];//产生【10,50】的整数,总共最多有41个整数(必然会有重复数字)
Random random = new Random();
//第一个for循环,产生随机数并放入数组中
for(int i = 0;i<50;i++)
{
int randomInt = random.nextInt(41)+10;
array[randomInt-10]++; //默认的int型数组的默认值是1,一旦某个相应的值产生,使数组中的值加1,之后数组中的
}
//第二个for循环,由于数组本身的映射关系,自然升序排列的,打印--就是升序打印
for(int i =0;i<41;i++)
{
if(0==array[i])
{
continue;
}
System.out.println((i+10)+"的出现次数为"+array[i]);
}
//第三个for循环,找出数组中最大值
int max = array[0];
for(int i =0;i<41;i++)
{
if(max<array[i])
{
max = array[i];
}
}
System.out.println("-------------------------------");
System.out.println("最大的出现次数为: "+max);
System.out.print("出现最多次的数字有: ");
//打印数组中所有与最大值相等的元素,打印(元素下标+10-->就是打印出现次数最大的随机数
for(int i =0;i<41;i++)
{
if(array[i]==max)
{
System.out.print((i+10)+" ");
}
}
}
}
一次运行结果:
11的出现次数为2
12的出现次数为2
14的出现次数为2
17的出现次数为4
18的出现次数为1
20的出现次数为1
21的出现次数为2
22的出现次数为1
23的出现次数为1
24的出现次数为2
25的出现次数为2
26的出现次数为1
27的出现次数为1
28的出现次数为2
31的出现次数为4
32的出现次数为2
33的出现次数为2
34的出现次数为2
35的出现次数为3
36的出现次数为4
41的出现次数为1
42的出现次数为2
45的出现次数为2
47的出现次数为1
48的出现次数为2
50的出现次数为1
-------------------------------
最大的出现次数为: 4
出现最多次的数字有: 17 31 36
改进:没有做相关封装,整个都在main中,应该按功能做成相关函数