Как отсортировать массив по «корзинам» и распечатать звезды, сколько чисел в этой корзине? - PullRequest
0 голосов
/ 03 октября 2018

// так что в основном для всего, что ниже, я пытаюсь отсортировать случайные числа, которые были сгенерированы, и затем «сортировать», затем в мусорные ведра, а затем для количества чисел в корзине, звездочка* распечатает для каждого номера.в конце это будет выглядеть как гистограмма.например:

12 случайных целых чисел в [0, 10), отсортированных по 2 ячейкам:

******* 7 0.5833333 [5.0, 10.0)

***** 5 0.41666666 [0.0, 5.0), но он пропускает два последних метода - generateBins и printBins.Как бы я отсортировал случайные числа в ячейки в зависимости от числа (как выше) и вывести * для каждого числа в этом массиве?

public class BinSort {
    final int totalBins;
    final int totalRandom;
    final float widthBin;
    int [] storeNumbers;
    int [] binCount;

public BinSort (int nBins, int nSamples, int max) {
    totalBins = nBins; //total # of bins, ie 2
    totalRandom = nSamples; //total random number generated, ie 12
    widthBin = (float) (max/totalBins); ie 2


    int [] storeNumbers = new int [max];
    for (int i = 0; i < totalRandom-1; i++) {
storeNumbers[i] = Random.rand(i, max);
System.out.println(storeNumbers[i]);
}
}
void generateBins () {
    int [] binCount = new int [totalBins];
    for (int i=0; i < totalRandom-1; i++) {
    int bin = (int)(storeNumbers[i]/ totalBins);
    Math.floor(bin);
    bin  = binCount [i];
    }
}

void printBins () {
for (int i = 0; i < binCount.length - 1; i++) {
        for (int j=0; j < binCount[j]; j ++) {
           System.out.print("*");
           System.out.println(); }
    float freq = (binCount[i]/totalRandom);
    float binMin = (i * widthBin);
    float binMax = (binMin * widthBin);
    System.out.print(binCount[i] + freq + binMin + binMax);
    System.out.println();
    }
  }
}

1 Ответ

0 голосов
/ 03 октября 2018

В вашем конструкторе у вас есть

int [] storeNumbers = new int [max];

Проблема здесь в том, что это создаст новую локальную переменную с тем же именем, что и у вашей переменной экземпляра, storeNumbers.Кроме того, размер должен быть totalRandom, а не max.Вам нужно создать объект Random, который вы будете использовать для генерации случайных чисел.Сложив это вместе, мы получим:

public BinSort (int nBins, int nSamples, int max) {
  totalBins = nBins; //total # of bins, ie 2
  totalRandom = nSamples; //total random number generated, ie 12
  widthBin = (float) (max/totalBins); //ie 2

  storeNumbers = new int [totalRandom];
  Random rand = new Random();  
  for (int i = 0; i < totalRandom; i++) {
    storeNumbers[i] = rand.nextInt(max);
  }
}

Это сгенерирует totalRandom случайные числа между 0 и max (эксклюзив) и сохранит их в переменной экземпляра storeNumbers.

Далее, в generateBins у вас та же проблема с

int [] binCount = new int [totalBins];

, которая снова будет скрывать переменную вашего экземпляра binCount.Бункер, в который попадает storeNumber, будет задан как (int)(storeNumbers[i] / widthBin), и вам нужно увеличить результирующий лот на 1.

void generateBins()
{
  binCount = new int[totalBins];
  for (int i = 0; i < totalRandom; i++)
  {
    int bin = (int)(storeNumbers[i] / widthBin);
    binCount[bin] += 1;
  }
}

Наконец, до печати лотков.Эта строка

for (int j=0; j < binCount[j]; j ++) 

должна быть

for (int j=0; j < binCount[i]; j ++) 

Кроме того, вы должны использовать printf для форматирования чисел, которые вы хотите напечатать.

void printBins()
{
  for (int i = 0; i < binCount.length; i++)
  {
    for (int j = 0; j < binCount[i]; j++)
    {
      System.out.print("*");
    }
    float freq = (float)binCount[i] / totalRandom;
    float binMin = i * widthBin;
    float binMax = (i+1) * widthBin;
    System.out.printf(" %d %.3f %.3f %.3f\n", binCount[i], freq, binMin, binMax);
  }
}

Тест:

public static void main(String[] args)
{
  BinSort bs = new BinSort(2, 12, 10);
  bs.generateBins();
  bs.printBins();
}

Вывод:

***** 5 0.417 0.000 5.000
******* 7 0.583 5.000 10.000

Я думаю, это то, что вы искали.

Обязательно сравните исходный код с приведенными выше изменениями и убедитесь, что вы понимаете, в чем заключались проблемы и почему эти изменения работают.

...