Взвешенная случайность на основе текущих значений (не знаю, как еще это объяснить) - PullRequest
2 голосов
/ 18 июня 2020

Нужна помощь с кодом (Java)

У меня есть сценарий, который запускается каждые несколько минут. Этот сценарий создает и удаляет объекты

Для этого примера я хочу иметь в среднем 10 объектов в любой момент времени

Но случайная вероятность создания и удаления объектов в зависимости от того, насколько далеко от этой цели 10 с жесткими ограничениями, например + - 3

I получили его для создания объектов, пока он не достигнет 7, а затем удалить, как только он пройдет 13 Но я не могу понять, как сделать случайность между

Если есть, скажем, 8 объектов, то вероятность создание, а не удаление, если их 10, то его разделение 50/50, а если есть 12, то его более вероятно удалить, а затем создать

, и я не запрашиваю код, я рад выяснить это сам. просто нужен пу sh в правильном направлении

Редактировать для обновления с тем, что у меня есть сейчас, у меня нет полного кода, так как происходит много других вещей, но это часть, с которой мне нужна помощь

Это выполняется каждые мин

int limit = F_Config.get().getInt("Limit");
int avg = F_Config.get().getInt("Average");
int current = P_Player.ReturnList().size();
int min = avg - limit;
int max = avg + limit;

//below min
if(current < min) {
    Main.sendConsole("Min");
    P_Player.LoginPlayer();
}

//above Max
else if(current > max) {
    Main.sendConsole("Max");
    P_Player.LogoutPlayer();
}

//Between min and Max
else{
    //Stuff here
}

1 Ответ

2 голосов
/ 18 июня 2020

Сначала нужно уточнить алгоритм, после того, как реализовать (java) еще что-то.
Есть 2 операции: [добавить] и [удалить], и вы должны определить на основе некоторых критериев вероятность.

Скажите: [Objects, AddP, DeleteP]

  1. [0,1,0] -> единственный вариант - добавить
  2. [от 1 до n, a, 1-a], например: [1-9, 0,75, 0,25]
  3. [n + 1, m, b, 1-b], например: [10-15. 0.3, 0.7]
  4. [m + 1, 0, 1], например: [16, 0, 1] -> единственный вариант - удалить

On [2] и [3] просто сгенерируйте случайное число, сравните с вероятностью a, b и выберите операцию. Например: [2] random = 0.60 <0.75 => add, et c

Примечание: 0

import java.util.ArrayList;
import java.util.List;

public class Prob 
{
    List<PSet> l = new ArrayList<PSet>();
    List<MyObj> obj = new ArrayList<MyObj>();
    @SuppressWarnings("unchecked")
    public static void main(String args[])
    {
        Prob p = new Prob();
        PSet ps1 = p.new PSet(0,0,1,0);
        PSet ps2 = p.new PSet(1,3,0.8,0.2);
        PSet ps3 = p.new PSet(4,5,0.3,0.7);
        PSet ps4 = p.new PSet(6,6,0,1);
        p.l.add(ps1);
        p.l.add(ps2);
        p.l.add(ps3);
        p.l.add(ps4);

        //loop 20 times
        for(int i=0;i<20;i++)
        {
            int counter = p.obj.size();
            for(int j=0;j<p.l.size();j++)
            {
                PSet ps = p.l.get(j);
                if(counter == 0 && counter == ps.start)
                {
                    System.out.println(i+"_only_add, counter="+counter);
                    p.obj.add(p.new MyObj(String.valueOf(i)));

                }
                else if(counter > 0 && counter == ps.start && counter == ps.end)
                {
                    System.out.println(i+"_only_del, counter="+counter);
                    p.obj.remove(0);
                }

                else if(counter>=ps.start && counter<=ps.end)
                {
                    double rand = Math.random();
                    if(rand<ps.pAdd)
                    {
                        System.out.println(i+"_add, counter="+counter);
                        p.obj.add(p.new MyObj(String.valueOf(i)));
                    }
                    else
                    {
                        System.out.println(i+"_del, counter="+counter);
                        p.obj.remove(0);
                    }
                }

            }
        }
    }
    class MyObj
    {
        String name;
        MyObj(String name)
        {
            this.name = name;
        }
    }
    class PSet
    {
        public int getStart() {
            return start;
        }
        public int getEnd() {
            return end;
        }
        public double getpAdd() {
            return pAdd;
        }
        public double getpDel() {
            return pDel;
        }
        int start;
        int end;
        double pAdd;
        double pDel;
        PSet(int start, int end, double pAdd, double pDel)
        {
            this.start = start;
            this.end = end;
            this.pAdd = pAdd;
            this.pDel = pDel;
        }
    }
}

Вывод:

0_only_add, counter=0
1_add, counter=1
2_add, counter=2
3_add, counter=3
4_del, counter=4
5_add, counter=3
6_del, counter=4
7_add, counter=3
8_del, counter=4
9_add, counter=3
10_del, counter=4
11_add, counter=3
12_del, counter=4
13_add, counter=3
14_add, counter=4
15_add, counter=5
16_only_del, counter=6
17_del, counter=5
18_del, counter=4
19_del, counter=3

...