1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите [Java] Рандом с учётом настраиваемых шансов

Тема в разделе "Разработка плагинов для новичков", создана пользователем Dexel, 14 май 2017.

  1. Автор темы
    Dexel

    Dexel Активный участник Пользователь

    Баллы:
    76
    Добрый день.
    У меня есть несколько настраиваемых в конфигурации натуральных чисел, не превышающих 100. Они обозначает шансы срабатывания какого-то кода. Как можно реализовать рандом с шансом выпадения, равным этим числам? Например, шанс, что сработает этот код - x%, этот - n%, этот a%?
     
  2. ItzFirstException

    ItzFirstException Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    FirstException
    Да, всё верно.
     
  3. gamerforEA

    gamerforEA Старожил Пользователь

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    http://stackoverflow.com/a/11552190
    Конечно, этот метод больше подходит для констант, но его можно легко переделать под ваш случай.
    Суть такова: делим промежуток от 0 до 1 (ну или от 0 до 100) на небольшие сегменты, соответствующие заданным в конфиге значениям, и проверяем, в какой именно промежуток попадает число, сгенерированное рандомайзером. Тут главное, чтобы сумма всех вероятностей была равна 1 (или 100).
     
    Последнее редактирование: 14 май 2017
  4. Автор темы
    Dexel

    Dexel Активный участник Пользователь

    Баллы:
    76
    Я чутка нуб. Пример кода можно? В гугле забанили.
     
  5. Grazy

    Grazy Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Prost
    PHP:
    double d =Math.random();
    if(
    <0.5)    // 50% chance of being here
    else if(<0.7)   // 20% chance of being here
    else
          
    // 30% chance of being here
    PHP:
    int foo =Math.random()*100;
    if(
    foo <80)    // 0-79
    sendMessage("hi");
    else if(
    foo <85)// 80-84
    sendMessage("bye");
    else 
    // 85-99
    sendMessage("test");
     
  6. Автор темы
    Dexel

    Dexel Активный участник Пользователь

    Баллы:
    76
    Как мне построить эти конструкции if-else, если я не знаю даже, сколько дадут чисел?
     
  7. Deawilld

    Deawilld Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    Deawilld
    Сам этим вопросом задался, но что ты подразумеваешь под этим и этим кодом?
    этот код можно переделать под List или Map, сейчас попробую примерно набросать код, мне тоже нужно, если тебе подойдёт, протести за меня плиз)
    Код:
            HashMap<Object, Double> randomMap = new HashMap<>(); //Элементы для рандома и шансы
            double rnd = new Random().nextDouble();
            double chance = 0.0; //Каждую итерацию цикла прибавляем шанс объекта
            Object defaultValue = "Используй, если не уверен, что сумма шансов 100%";
            for(Object o : randomMap.keySet()){
                chance += randomMap.get(o);
                if(rnd <= chance){
                    //Обрабатываем полученный объект o
                    break; //или return o; если надо его вернуть
                }
            }
            //return defaultValue или null
    
    Проверил, вроде работает. HashMap легко можно заменить на список объектов класса, у которого есть шансы выпадения.
     
  8. Code

    Code Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    _Gizmo
    тебе скорее всего не нужны if else
    у тебя код с разными шансами как-то зависит друг от друга?
    если нет, то просто if (random.nextInt(100) < n) { твой код }
    где n число из конфига
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Код:
    public class RandomDrop {
        private int i;
    
        public RandomDrop(int i) {
            this.i = i;
        }
    
        boolean rand() {
            return new Random().nextInt(100) < i;
        }
    }
    Как то так.
     

Поделиться этой страницей