Здравствуйте, уважаемые специалисты. Прошу помочь с такой задачей. В столбце Было в каждой ячейке идет перечисление моделей по алфавиту. Необходимо поменять местами модели так, чтобы они не были по алфавиту, а максимально отличались. В столбце Стало я прописала примерный итог. Он может быть любым, главное, чтобы похожие модели не стояли рядом. Например, в ячейке A4 "HP1630, HP1631, HR2230, M8100, M8101, M9800, TM3000C, TM3010C" - HP1630, HP1631 и M8100, M8101 - не должны находится рядом.
Здравствуйте, уважаемые специалисты. Прошу помочь с такой задачей. В столбце Было в каждой ячейке идет перечисление моделей по алфавиту. Необходимо поменять местами модели так, чтобы они не были по алфавиту, а максимально отличались. В столбце Стало я прописала примерный итог. Он может быть любым, главное, чтобы похожие модели не стояли рядом. Например, в ячейке A4 "HP1630, HP1631, HR2230, M8100, M8101, M9800, TM3000C, TM3010C" - HP1630, HP1631 и M8100, M8101 - не должны находится рядом.Marandi
Я такой вариант тоже рассматривал, но тут ведь не соблюдается главное условие - "главное, чтобы похожие модели не стояли рядом." Ставятся как попало, и меняются при каждом пересчёте...
Я такой вариант тоже рассматривал, но тут ведь не соблюдается главное условие - "главное, чтобы похожие модели не стояли рядом." Ставятся как попало, и меняются при каждом пересчёте...Hugo
Вероятность того, что случайные числа встанут рядом, если стоят рядом модели, очень мала. Если не нужен пересчёт, Копировать/Вставить как значения
Вероятность того, что случайные числа встанут рядом, если стоят рядом модели, очень мала. Если не нужен пересчёт, Копировать/Вставить как значенияPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Может быть поменять местами типа так - 1, 5, 2, 4, 3...
Имеет смысл - этот алгоритм снимает вопросы случайного выбора и близких кодов. Но при четном количестве кодов трудно избавиться от близких кодов, стоящих в центре последовательности. Пример UDF прилагается.
Цитата
Может быть поменять местами типа так - 1, 5, 2, 4, 3...
Имеет смысл - этот алгоритм снимает вопросы случайного выбора и близких кодов. Но при четном количестве кодов трудно избавиться от близких кодов, стоящих в центре последовательности. Пример UDF прилагается.NikitaDvorets
Вероятность "близких" кодов, на мой взгляд, незначительна
Здравствуйте. Я тоже сначала так думал, а когда прикинул вероятность наличия хотя бы одного "соседства", то результат меня сильно удивил. При 5 элементах вероятность 0.92, при 10 и далее до 1000 - 0.86. (погрешность не больше 1%) Наверное будет лучше изменить код и избавиться от соседних элементов. У меня получился такой вариант. [vba]
Код
Function Rearrange(St As String) As String Dim i As Integer, j As Integer, arr, Flag As Boolean, B As Integer arr = Split(Trim(St), ", ") B = UBound(arr) If B < 4 Then Rearrange = St Exit Function End If Randomize ReDim arr2(B) Do Flag = True 'Создаём вспомогательный рандомный массив индексов элементов For i = 0 To B j = Int(Rnd * i) arr2(i) = arr2(j) arr2(j) = i Next i 'Проверяем его на наличие "соседних" значений For i = 1 To B If Abs(arr2(i) - arr2(i - 1)) = 1 Then Flag = False Next 'Повторяем, пока в индексном массиве не будет "соседних" значений Loop Until Flag Rearrange = arr(arr2(0)) For i = 1 To B Rearrange = Rearrange & ", " & arr(arr2(i)) Next End Function
Вероятность "близких" кодов, на мой взгляд, незначительна
Здравствуйте. Я тоже сначала так думал, а когда прикинул вероятность наличия хотя бы одного "соседства", то результат меня сильно удивил. При 5 элементах вероятность 0.92, при 10 и далее до 1000 - 0.86. (погрешность не больше 1%) Наверное будет лучше изменить код и избавиться от соседних элементов. У меня получился такой вариант. [vba]
Код
Function Rearrange(St As String) As String Dim i As Integer, j As Integer, arr, Flag As Boolean, B As Integer arr = Split(Trim(St), ", ") B = UBound(arr) If B < 4 Then Rearrange = St Exit Function End If Randomize ReDim arr2(B) Do Flag = True 'Создаём вспомогательный рандомный массив индексов элементов For i = 0 To B j = Int(Rnd * i) arr2(i) = arr2(j) arr2(j) = i Next i 'Проверяем его на наличие "соседних" значений For i = 1 To B If Abs(arr2(i) - arr2(i - 1)) = 1 Then Flag = False Next 'Повторяем, пока в индексном массиве не будет "соседних" значений Loop Until Flag Rearrange = arr(arr2(0)) For i = 1 To B Rearrange = Rearrange & ", " & arr(arr2(i)) Next End Function
Если кому то интересно, то для достаточно большого количества элементов вероятность "соседства" после равномерного перемешивания будет стремиться к значению 1-1/e2
Если кому то интересно, то для достаточно большого количества элементов вероятность "соседства" после равномерного перемешивания будет стремиться к значению 1-1/e2i691198
Сообщение отредактировал i691198 - Понедельник, 01.07.2024, 21:15