Обсудим Равномерный рандомайзер

CodeLomer

Пользователь
Сообщения
38
Очень важная тема для работы с случайностью. Эту случайность нужно сделать равномерной в определённом радиусе. Тоесть получать как можно чаще уникальные координаты в майнкрафте без повторений и без хеширования локаций. У кого есть идеи ? Нашел интересную статью насчет этого - но как можно это адаптировать под "настраиваемый пончик" чтобы случайное местоположение было получено к примеру от 2000 до 4000 и также от -2000 до -4000 а все что внутри не входило в его поиск. Нужен примерно такой алгоритм поиска локаций
 
Очень важная тема для работы с случайностью. Эту случайность нужно сделать равномерной в определённом радиусе. Тоесть получать как можно чаще уникальные координаты в майнкрафте без повторений и без хеширования локаций. У кого есть идеи ? Нашел интересную статью насчет этого - но как можно это адаптировать под "настраиваемый пончик" чтобы случайное местоположение было получено к примеру от 2000 до 4000 и также от -2000 до -4000 а все что внутри не входило в его поиск. Нужен примерно такой алгоритм поиска локаций
ThreadLocalRandom.current().nextInt(min, max + 1);
 
Вам необходимо зарегистрироваться для просмотра изображений-вложений

Java:
        int innerRadius = 2000;
        int outerRadius = 4000;
        int numCoordinatesToGenerate = 50;

        Set<String> uniqueCoordinates = new HashSet<>();
        ThreadLocalRandom random = ThreadLocalRandom.current();
        while (uniqueCoordinates.size() < numCoordinatesToGenerate) {
            double r = innerRadius + (outerRadius - innerRadius) * random.nextDouble();
            double theta = random.nextDouble() * 2 * Math.PI;
            int x = (int) (r * Math.cos(theta));
            int z = (int) (r * Math.sin(theta));

            String coordinateString = x + "," + z;
            uniqueCoordinates.add(coordinateString);
        }
 
Вам необходимо зарегистрироваться для просмотра изображений-вложений

Java:
        int innerRadius = 2000;
        int outerRadius = 4000;
        int numCoordinatesToGenerate = 50;

        Set<String> uniqueCoordinates = new HashSet<>();
        ThreadLocalRandom random = ThreadLocalRandom.current();
        while (uniqueCoordinates.size() < numCoordinatesToGenerate) {
            double r = innerRadius + (outerRadius - innerRadius) * random.nextDouble();
            double theta = random.nextDouble() * 2 * Math.PI;
            int x = (int) (r * Math.cos(theta));
            int z = (int) (r * Math.sin(theta));

            String coordinateString = x + "," + z;
            uniqueCoordinates.add(coordinateString);
        }
тут 50.000 точек:
Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
Java:
int innerRadius = 2000;
        int outerRadius = 4000;
        int xCentre = 500;
        int zCentre = 200;
        int numCoordinatesToGenerate = 50000;

        Set<String> uniqueCoordinates = new HashSet<>();
        ThreadLocalRandom random = ThreadLocalRandom.current();
        while (uniqueCoordinates.size() < numCoordinatesToGenerate) {
            double r = innerRadius + (outerRadius - innerRadius) * random.nextDouble();
            double theta = random.nextDouble() * 2 * Math.PI;
            int x = (int) (xCentre + r * Math.cos(theta));
            int z = (int) (zCentre + r * Math.sin(theta));

            String coordinateString = x + "," + z;
            uniqueCoordinates.add(coordinateString);
        }
с централизацией
Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
спасибо большое а с помощью чего было достигнуто равномерность ?
Уборка повторений - Set коллекция.
Круговая равномерность с помощью
int x = (int) (xCentre + r * Math.cos(theta));
int z = (int) (zCentre + r * Math.sin(theta));
если исключить этот код будет рандомизировать по квадрату.
 
надо бы как-нибуть без фильтрации минимизировать это. Чтобы сразу получать (с наиболее вероятной возможностью) сразу уникальную локацию как и предлагалось в той статье
как ты предлагаешь это минимизировать?
Объединено

надо бы как-нибуть без фильтрации минимизировать это. Чтобы сразу получать (с наиболее вероятной возможностью) сразу уникальную локацию как и предлагалось в той статье
Java:
            double r = innerRadius + (outerRadius - innerRadius) * random.nextDouble();
            double theta = random.nextDouble() * 2 * Math.PI;
            int x = (int) (xCentre + r * Math.cos(theta));
            int z = (int) (zCentre + r * Math.sin(theta));
можно вставить этот код, всеравно будет равномерно распределять точки локаций. Set<String> - нужен только для того, чтобы отобразить точки для демонстрации
 
Вам необходимо зарегистрироваться для просмотра изображений-вложений

Качество конечно не очень, но что есть то есть, тут вот изображена рандомизация на 500 рандомных телепортов.
 
в перспективе это же будет лучше чем просто получать рандомные координаты без косинуса и синуса и тд при условии что неподходящих локаций много?
думаю, что разницы нет. Просто этот код распределяет рандом по окружности, в обычном рандоме - квадрат. Локаций по факту одинаково, но расположение разное
 
Назад
Сверху Снизу