Java сгенерировать неповторяющийся "Vector3" - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь создать список из ста тысяч случайных точек в трехмерном пространстве внутри трехмерной границы, при этом ни одна из точек не занимает одинаковую позицию. Я буквально пытаюсь создать неповторяющийся генератор Vector3. Есть ли какой-нибудь эффективный способ сделать это? Кроме того, это нормально, если эти точки не распределены равномерно, на самом деле предпочтительно, если они будут кем-то сгруппированы здесь, при условии, что они не занимают одну и ту же позицию.

Чтобы уточнить, я не пытаюсь генерировать 300 000 уникальных очков. Но вместо 100000 3d очков. Таким образом, допустимы векторные значения (0, 0, 0) и (0, 0, 1). Но (4, 4, 4) и (4, 4, 4) недопустимы.

public class Vector3
{
    public float x;
    public float y;
    public float z;

    Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public static ArrayList<Vector3> generateVector3s()
    {
        ArrayList<Vector3> tempVector3List = new ArrayList<>();
        
        for (int i = 0; i < 100000; i++)
        {   
            tempVector3List.add(new Vector3(RANDOMVALUE, RANDOMVALUE, RANDOMVALUE));
        }
        
        return tempVector3List ;
    }
}

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Во-первых, генерация случайных чисел в Java:

Компьютерщики для компьютерных фанатов на случайных числах в Java

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

0 голосов
/ 09 июля 2020

Похоже, вы ищете 3D-версию метода Пуассона c выборки, которая гарантирует, что точки не будут кластеризоваться в одних и тех же областях.

Алгоритм довольно сложен, поэтому я не буду его описывать здесь полностью, но основная идея c состоит в том, что вы выбираете начальную точку и развиваете ее наружу, всегда добавляя точки, которые находятся, по крайней мере, на заданном расстоянии от существующих точек.

Вы можете найти подробные описания и реализации здесь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...