English 中文(简体)
Generate random number histogram using java
原标题:

Histogram

--------------------------------------------------------
  1 ****(4)
  2 ******(6)
  3 ***********(11)
  4 *****************(17)
  5 **************************(26)
  6 *************************(25)
  7 *******(7)
  8 ***(3)
  9 (0)
 10 *(1)
--------------------------------------------------------

basically above is what my prgram needs to do.. im missing something somewhere any help would be great :)

import java.util.Random; 
public class Histogram
{

    /*This is a program to generate random number histogram between
    1 and 100 and generate a table */

    public static void main(String args[])
    {

        int [] randarray = new int [80];
        Random random = new Random();
        System.out.println("Histogram");
        System.out.println("---------");

        int i ;
        for ( i = 0; i<randarray.length;i++)
        {   
            int temp = random.nextInt(100); //random numbers up to number value 100
            randarray[i] = temp;

        }

        int [] histo = new int [10];
        for ( i = 0; i<10; i++)
        {
            /* %03d	, this generates the random numbers to
            three decimal places so the numbers are generated
            with a full number or number with 00 s or one 0*/


            if (randarray[i] <= 10) {
                histo[i] = histo[i] + 1;
            //System.out.println("*");
            }
            else if ( randarray[i] <= 20){
            histo[i] = histo[i] + 1;
            }
            else if (randarray[i] <= 30){
            histo[i] = histo[i] + 1;
            }
            else if ( randarray[i] <= 40){
            histo[i] = histo[i] + 1;
            }
            else if (randarray[i] <= 50){
            histo[i] = histo[i] + 1;
            }
            else if ( randarray[i] <=60){
            histo[i] = histo[i] + 1;
            }
            else if ( randarray[i] <=70){
            histo[i] = histo[i] + 1;
            }
            else if ( randarray[i] <=80){
            histo[i] = histo[i] + 1;
            }
            else if ( randarray[i] <=90){
            histo[i] = histo[i] + 1;
            }
            else if ( randarray[i] <=100){
            histo[i] = histo[i] + 1;
            }

            switch (randarray[i])
            {
            case 1: System.out.print("0-10 | "); break;
            case 2: System.out.print("11-20 | "); break;
            case 3: System.out.print("21-30 | "); break;
            case 4: System.out.print("31-40 | "); break;
            case 5: System.out.print("41-50 | "); break;
            case 6: System.out.print("51-60 | "); break;
            case 7: System.out.print("61-70 | "); break;
            case 8: System.out.print("71-80 | "); break;
            case 9: System.out.print("81-90 | "); break;
            case 10: System.out.print("91-100 | "); 
            }
                for (int i = 0; i < 80; i++)
            {
              randomNumber = random.nextInt(100)
              index = (randomNumber - 1) / 2;
              histo[index]++;
            }
    }
   }
 }
问题回答

Your random data contains 80 values but you are only iterating through the first 10. You should be iterating through all 80. You would use histo[1], histo[2], etc instead of histo[i].

Also, the whole big switch block could be simplified into

histo[randarray[i] / 10]++;

And instead of creating the randarray and then looping through it, you could simply do this:

for(int i = 0; i < 80; i++)
{
    histo[random.nextInt(100) / 10]++;
}

You are only looping through 10 times, though you have 80 random numbers in your array.

This line is also flawed. You don t want to use the same counter variable for going through the array and determining which histogram bin to increment.

 if (randarray[i] <= 10) {
                        histo[i] = histo[i] + 1;

UPDATE:

You should try to come up with an algorithm to turn a random value into a bin, as your solution isn t scalable, and you will be getting used to bad programming habits.

Your last for loop won t compile - there are a lot of syntax errors there.

You need to fill the hists with your random numbers, THEN print them out.

You want to print the counts in your hist array out in each case statement before you break as well.

Good luck if you continue to learn programming!

Another point to consider is that your histogram will be a flat, uniform distribution, not a normal distribution like you show in your question.

If I read that right, then I think your switch statement is messed up.

Your randarray values are from 0 < randarray[i] < 100 but you are only giving values up to 10 for your switch. That would probably throw something off.

Just my guess.





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签