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

  • Автор темы Автор темы Dexel
  • Дата начала Дата начала

Dexel

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
SiRiuS_OSiRiuS
Добрый день.
У меня есть несколько настраиваемых в конфигурации натуральных чисел, не превышающих 100. Они обозначает шансы срабатывания какого-то кода. Как можно реализовать рандом с шансом выпадения, равным этим числам? Например, шанс, что сработает этот код - x%, этот - n%, этот a%?
 
Добрый день.
У меня есть несколько настраиваемых в конфигурации натуральных чисел, не превышающих 100. Они обозначает шансы срабатывания какого-то кода. Как можно реализовать рандом с шансом выпадения, равным этим числам? Например, шанс, что сработает этот код - x%, этот - n%, этот a%?
Да, всё верно.
 
http://stackoverflow.com/a/11552190
Конечно, этот метод больше подходит для констант, но его можно легко переделать под ваш случай.
Суть такова: делим промежуток от 0 до 1 (ну или от 0 до 100) на небольшие сегменты, соответствующие заданным в конфиге значениям, и проверяем, в какой именно промежуток попадает число, сгенерированное рандомайзером. Тут главное, чтобы сумма всех вероятностей была равна 1 (или 100).
 
Последнее редактирование:
http://stackoverflow.com/a/11552190
Конечно, этот метод больше подходит для констант, но его можно легко переделать под ваш случай.
Суть такова: делим промежуток от 0 до 1 (ну или от 0 до 100) на небольшие сегменты, соответствующие заданным в конфиге значениям, и проверяем, в какой именно промежуток попадает число, сгенерированное рандомайзером. Тут главное, чтобы сумма всех вероятностей была равна 1 (или 100).
Я чутка нуб. Пример кода можно? В гугле забанили.
 
PHP:
double d =Math.random();
if(d <0.5)    // 50% chance of being here
else if(d <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");
 
PHP:
double d =Math.random();
if(d <0.5)    // 50% chance of being here
else if(d <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");
Как мне построить эти конструкции if-else, если я не знаю даже, сколько дадут чисел?
 
Сам этим вопросом задался, но что ты подразумеваешь под этим и этим кодом?
Например, шанс, что сработает этот код - x%, этот - n%, этот a%?
double d =Math.random();
if(d <0.5) // 50% chance of being here
else if(d <0.7) // 20% chance of being here
else
// 30% chance of being here
этот код можно переделать под 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 легко можно заменить на список объектов класса, у которого есть шансы выпадения.
 
Как мне построить эти конструкции if-else, если я не знаю даже, сколько дадут чисел?
тебе скорее всего не нужны if else
у тебя код с разными шансами как-то зависит друг от друга?
если нет, то просто if (random.nextInt(100) < n) { твой код }
где n число из конфига
 
Код:
public class RandomDrop {
    private int i;

    public RandomDrop(int i) {
        this.i = i;
    }

    boolean rand() {
        return new Random().nextInt(100) < i;
    }
}
Как то так.
 
Назад
Верх