2014-09-12 2 views
-2

Мне нужно вызвать методы в соответствии с их весовыми коэффициентами.Выполнить методы в соотношении

id  methodname  weight 
1   method1   10 
1   method2   20 
1   method3   20 

Эти идентификаторы будут зациклированы в a. Весовое отношение метода составляет 10:20:20 Всякий раз, когда мы сталкиваемся с id как 1- Таким образом, метод1 должен запускаться 20 процентов времени, метод2 - 40 процентов времени и метода3 - 40 процентов времени.

Это отношение должно поддерживаться всякий раз, когда вызывается идентификатор. Необходимо сделать это с использованием структур данных. Помощь PLS !!!

+6

Вы почти наверняка делаете что-то неправильно, если хотите этого. Какова проблема, которую вы пытаетесь решить? –

+0

Есть [Thread # setPriority] (http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setPriority (int)) достаточно? В противном случае это звучит так, как будто вам нужен собственный планировщик. –

+0

Это точная проблема, которую я пытаюсь решить. Единственное хранилище, которое я могу использовать, - это файл свойств. – Learner

ответ

1

Я хотел бы использовать список из Runnable и выбрать случайным образом из списка с уклоном пропорции:

static int method1Calls = 0; 
static int method2Calls = 0; 
static int method3Calls = 0; 

static final void method1() { 
    System.out.println("method1"); 
    method1Calls += 1; 
} 

static final void method2() { 
    System.out.println("method2"); 
    method2Calls += 1; 
} 

static final void method3() { 
    System.out.println("method3"); 
    method3Calls += 1; 
} 

Runnable call1 = new Runnable() { 

    @Override 
    public void run() { 
     method1(); 
    } 

}; 

Runnable call2 = new Runnable() { 

    @Override 
    public void run() { 
     method2(); 
    } 

}; 

Runnable call3 = new Runnable() { 

    @Override 
    public void run() { 
     method3(); 
    } 

}; 

public void test() { 
    // Put the three objects in a list. 
    List<Runnable> methods = Arrays.asList(call1, call2, call3); 
    // Call them in proportion. 
    int[] proportion = {0, 1, 1, 2, 2}; 
    Random r = new Random(); 
    for (int i = 0; i < 100; i++) { 
     // Pick one. 
     int n = r.nextInt(proportion.length); 
     // Run it. 
     methods.get(proportion[n]).run(); 
    } 
    System.out.println("method1 called " + method1Calls + " times."); 
    System.out.println("method2 called " + method2Calls + " times."); 
    System.out.println("method3 called " + method3Calls + " times."); 
} 

гравюр в конце:

method1 called 26 times. 
method2 called 40 times. 
method3 called 34 times. 

Для того, чтобы количество вызовов точно предсказуемый, но случайный, вам необходимо использовать механизм тасования:

public void testShuffle() { 
    System.out.println("Using shuffle"); 
    // Put the three objects in a list. 
    List<Runnable> methods = new ArrayList<>(); 
    // Call them in proportion 
    Runnable[] runners = {call1, call2, call3}; 
    int[] proportion = {10, 20, 20}; 
    // Grow my list. 
    for (int i = 0; i < proportion.length; i++) { 
     for (int j = 0; j < proportion[i]; j++) { 
      methods.add(runners[i]); 
     } 
    } 
    // Shuffle it. 
    Collections.shuffle(methods); 
    // Call them. 
    for (Runnable r : methods) { 
     r.run(); 
    } 
    System.out.println("method1 called " + method1Calls + " times."); 
    System.out.println("method2 called " + method2Calls + " times."); 
    System.out.println("method3 called " + method3Calls + " times."); 
} 

Отпечатано:

method1 called 10 times. 
method2 called 20 times. 
method3 called 20 times. 
0

Если вы хотите, чтобы равномерно распределять вызовы методов между набором методов, то есть очень простой способ:

Math.random 

Почему? Потому что это гарантирует, что это вернет номер, отобранный из диапазона [0, 1) из равномерного распределения. Это означает, что любое число в случайном порядке равномерно будет возвращено.

Это, конечно, случайный, поэтому в теории 0.0 может быть возвращен каждый раз отныне до конца времени - это характер случайности. Но вы указываете «процентный шанс», и именно это и есть.

Так что нам нужно разделить диапазон на 5 сегментов, а затем, если число:

  • в первом вызове сегмента method1
  • во втором или третьем сегменте вызова method2
  • в четвёртом или пятый вызов сегмента method3

Это соответствует:

final double random = Math.random() 
if(random < 0.2) { 
    method1(); 
} else if (random < 0.6) { 
    method2(); 
} else { 
    method3(); 
} 
+0

Это хорошее решение Бориса. Есть ли все равно, чтобы сделать его общим, так как в соотношении может быть случайным, как 1:10 или 10: 10: 10: 10 или 15: 5, и может быть любое количество методов для одного id. – Learner

+0

Я оставлю это как упражнение для @Learner. Подсказка: как я определил числа в этом примере? –

+0

В этом решении, если i loop id 10 раз, метод1 должен вызываться 2 раза, метод2 4 раза и метод3 - 4 раза. Существует вероятность того, что случайное число меньше 0,2 появляется 3 раза, метод1 будет называться 3 раза. Это неприемлемо для того, что я пытаюсь сделать. – Learner

Смежные вопросы