Как разбить массив случайным образом на m элементов ?

159
22 мая 2019, 01:40

Подскажите пожалуйста как решить данную задачу оптимальным способом :

  1. Данный массив разбить случайным образом на m фрагментов
  2. Границы фрагментов сохранить в новый массив

Пробовал пойти таким путем .Уперся в сохранение фрагментов в один массив

int[] arr = {1, 2, 3, 5, 6, 7, 8, 9, 0, 5, 6, 7, 8, 9, 2, 22};
    Random random = new Random();
    int rnd1 = 1 + random.nextInt(7);
    int rnd2 = 3 + random.nextInt(15);
    int[] col = Arrays.copyOfRange(arr, rnd1,rnd2);
    System.out.println("Массив равен " + Arrays.toString(col));
Answer 1

Разбить массив размера N случайным образом на M фрагментов - это ни что иное как сгенерировать M - 1 неповторяющихся случайных чисел в диапазоне [0, N-1). Каждое такое случайное число - позиция, после которой делается разбиение массива.

Для исходных массивов небольшого размера прекрасно сработает "алгоритм Кнута" (?), в т.ч. потому, что он сразу генерирует упорядоченную последовательность случайно выбранных значений

// C++
#include <cstdlib>
#include <vector>
#include <iostream>
unsigned random(unsigned n) 
{ // Случайное число в диапазоне [0, n)
  return std::rand() % n;
}
int main() 
{
  std::vector<int> arr = { 1, 2, 3, 5, 6, 7, 8, 9, 0, 5, 6, 7, 8, 9, 2, 22 };
  const unsigned N = arr.size(), M = 5;
  unsigned i = 0, n = N - 1, n_splits = M - 1;
  std::cout << "[ ";
  for (i = 0; i < n; ++i)
  {
    std::cout << arr[i] << " ";
    // Делаем в этом промежутке разрез с вероятностью
    // 
    //       осталось сделать разрезов       n_splits
    //    -------------------------------- = --------
    //    осталось просмотреть промежутков    n - i
    //
    if (random(n - i) < n_splits)
    {
      std::cout << "][ ";
      --n_splits;
    }
  }
  std::cout << arr[i] << " ]";
}

Получаем

[ 1 2 3 5 6 ][ 7 8 ][ 9 0 ][ 5 6 7 8 9 2 ][ 22 ]
READ ALSO
Как загрузить файл в arraylist

Как загрузить файл в arraylist

Мне нужно загрузить файл в arraylist и заменить определенные строки, после записать мой лист в другой файл, как это реализовать?

132
static и переопределение?

static и переопределение?

Все началось с того, что я прочитал про static и про то, что методы помеченные static не переопределяютсяНаписал вот такой код, да бы убедиться:

151
транзакция с OneToMany

транзакция с OneToMany

Я новичек, учу Hibernate и вот столкнулся с проблемойПри первом добавлении в БД, создает три таблицы из которых одна отображает связи - казалось...

141
Не получается подключить Tomcat 9 на ubuntu

Не получается подключить Tomcat 9 на ubuntu

Не могу запустить tomcat из папки opt/

121