Java - как разделить целое число на 5 случайных частей - PullRequest
0 голосов
/ 25 июня 2018

Я работаю над графическим приложением для Android, и в какой-то момент кода мне нужно разделить, скажем, ширину прямоугольника на 5 случайных размеров.

У меня есть моя функция случайного слияния (int min, int max) в моей деятельности, но это может помочь мне разделить ее на 2 части.

Как мне разделить целое число, скажем, 100на 5 случайных частей, так что первые одна или две части не всегда самые большие, тогда я подразделяю на третью, четвертую и пятую части?

Сейчас я знаю, что могу попытаться реализовать его, используя мой генератор случайных целых чисел, но проблема, я думаю, заключается в том, что мне придется использовать некоторые принудительные деления, такие как деление первых 70%целое число на 2 части, затем деление оставшихся 20% на две части, чтобы получить в общей сложности 5 частей, но такой метод всегда будет делать первую часть больше, чем пятую часть, которую я хотел бы избежать ...чтобы сделать его действительно случайным.

Что бы я хотел, например ...

первая часть, которая потенциально может быть 7, вторая часть 25, третья часть 5, четвертая часть 40, пятая/ последняя / оставшаяся часть 23. Добавить до 100 (или любое целое число).

Я не уверен, как написать логику такой функции ... поэтому, пожалуйста, если у вас есть какие-либо идеи о том, какчтобы реализовать функцию, которая случайным образом делит целое число на 3, 4, 5 или 6 действительно случайных размеров / частей, пожалуйста, просветите меня!

Спасибо за ваше время!

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

Самый эффективный способ сделать это и сохранить правильное распространение - выглядит так.

1) В общих случаях. Вам нужно разделить линию на N частей.

generate N-1 doubles [0,1], add 0 and 1, and sort them -> x[i] = {0, ..., 1}
N-1 point divide line into N parts -> 0=x[0]..x[1]; x[1]...x[2]; ... x[N]..x[N+1]=1
scale each part to proper size -> len[i] = (x[i+1]-x[i])*total_length
cast to int if needed

2) В случае, когда вам нужны большие объекты и небольшие промежутки - разделите вашу длину с желаемой пропорцией, например, 70% для объектов и 30% для промежутков. Или сгенерируйте его nextDouble (0.2) +0.2 для диапазона [0.2,0.4) для пробелов. Затем используйте предложенный алгоритм дважды.

0 голосов
/ 25 июня 2018

Простой алгоритм состоит в том, чтобы поместить числа 1-99 в список, перемешать их и взять первые 4 элемента в качестве «точек разделения», то есть позиций, на которые нужно разделить диапазон чисел.

List<Integer> splitPoints =
    IntStream.rangeClosed(1, 99)
        .boxed().collect(Collectors.toList());
Collections.shuffle(splitPoints);
splitPoints.subList(4, splitPoints.size()).clear();
Collections.sort(splitPoints);

Теперь у вас есть 4 случайно расположенных точки разделения.Диапазон значений:

  • 0 -> splitPoints.get(0)
  • splitPoints.get(0) -> splitPoints.get(1)
  • ...
  • splitPoints.get(3) -> 100.
0 голосов
/ 25 июня 2018

Вы можете выбрать случайным образом из оставшейся суммы.

int[] nums = new int[5];
int total = 100;
Random rand = new Random();
for (int i = 0; i < nums.length-1; i++) {
    nums[i] = rand.nextInt(total);
    total -= nums[i];
}
nums[nums.length-1] = total;
Arrays.sort(nums);

Это выберет случайное число и гарантирует, что сумма всегда одинакова. Последний sort гарантирует, что они находятся в порядке возрастания.

0 голосов
/ 25 июня 2018

Возьмите четыре числа из диапазона ниже:

4 to n-1

И затем разделите каждое число на четыре.

И пятое число будет n - (sum of other four).

Где nравно 100 в данном случае ..

Опять же, это один из способов реализации, и есть сотни способов его реализовать

Надеюсь, что это поможет.

...