Застрял на Дискретном распределении, имеющем проблему с окончанием проблемы - PullRequest
0 голосов
/ 03 мая 2020

Вот что я получаю.

Это то, что я на самом деле получаю.

Напишите программу DiscreteDistribution. java, который принимает целочисленный аргумент командной строки m, за которым следует последовательность положительных целочисленных аргументов командной строки a1, a2,…, an и печатает m случайных индексов (разделенных пробелами), выбирая каждый индекс i с вероятностью, пропорциональной к ай.

Пока у меня есть

public static void main(String[] args) {
    // number of random indices
    int m = Integer.parseInt(args[0]);

    // read in frequency of occurrence of n values
    int n = args.length;
    int[] freq = new int[n];
    for (int i = 0; i < n; i++) {
        freq[i] = Integer.parseInt(args[i]);
    }

    // compute total count of all frequencies
    int total = 0;
    for (int i = 0; i < n; i++) {
        total += freq[i];
    }
    for (int j = 0; j < m; j++) {
        // generate random integer with probability proportional to frequency
        int r = (int) ((total) * Math.random() - 1);   // integer in [0, total)
        int sum = 0;
        int event = -1;
        for (int i = 0; i < n && sum <= r; i++) {
            sum += freq[i];
            event = i;
            System.out.println(freq[i]);
        }
    }

}

1 Ответ

0 голосов
/ 03 мая 2020

Если предположить, что я правильно понимаю вашу проблему, то вы можете использовать следующий алгоритм для получения m случайных чисел в диапазоне от 1 до n в соответствии с заданными частотами:

 public static void main(String[] args) {

    // number of random indices
    int m = Integer.parseInt(args[0]);

    // read in frequency of occurrence of n values
    int n = args.length;
    int[] freq = new int[n];
    for (int i = 1; i < n; i++) {
      freq[i] = Integer.parseInt(args[i]);
    }

    // compute total count of all frequencies
    int total = 0;
    for (int i = 1; i < n; i++) {
      total += freq[i];
    }
    double[] summedProbabilities = new double[n];
    for (int i = 1; i < summedProbabilities.length; i++) {
      final double probability = freq[i] / (double) total;
      summedProbabilities[i] = summedProbabilities[i -1] + probability;

    }
    for (int j = 0; j < m; j++) {
      // generate random integer with probability proportional to frequency
      double randomProbability = Math.random();
      int i = 1;
      while (randomProbability > summedProbabilities[i]) {
        i++;
      }
      System.out.print(i + " ");
      if (j % 10 == 0) {
        System.out.println();
      }
    }
  }

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...