Консультация № 176820
21.02.2010, 05:46
0.00 руб.
0 4 3
Здравствуйте Уважаемые Эксперты !
Помогите чайнику ОЧЕНЬ Нужно! ПЛИЗ !
Есть набор чисел в Excel расположенных подряд в столбик
1
2
3
И т.д.
1000000
Нужно перемешать этот массив в хаотичном порядке
Заранее благодарен !!!!!!!!!!!!!!!!

Обсуждение

давно
Модератор
137394
1850
21.02.2010, 11:20
общий
это ответ
Здравствуйте, DimasaN.
У Вас есть натуральный ряд чисел. Вам надо получить массив с этими же числами, перемешанными в хаотичном порядке, при этом ни одно число в массиве не должно дублироавться.
Идея решения: используем генератор случайных чисел, но, чтобы получилась последовательность уникальных чисел, организуем 2 массива:
Mas - c искомой последовательностью,
Ind - для контроля, встречалось ли сгенерированное случайное число ранее
Решение оформлено в виде макроса.
Следует заметить, что, во первых, в моей версии Excel число строк не более 65536. Во вторых, очень большая размерность задачи потребует очень большого времени выполнения.
На моём компьютере для 65536 чисел потребовалось 6 сек. Но время выполнения будет возрастать, скорее всего, нелинейно.
Код:
' Заполняем массив Mas размерности от 1 до N
' уникальными натуральными числами от 1 до N в случайном порядке
' Результат отобразим в заданной колонке таблицы начиная с заданной строки
' Указанная колонка перед выводом очищается от старых данных

Col_Look = "A" ' В какой колонке отображаем результат
Row_Begin = 1 ' Начиная с какой строки отображаем результат

N = 65536 ' Максимальное значение массива


ReDim Mas(1 To N), Ind(1 To N)

For i = 1 To N
Ind(i) = True
Next

i = 0
Randomize
Do While i < N
k = Int((N * Rnd) + 1)
If Ind(k) Then
i = i + 1
Mas(i) = k
Ind(k) = False
End If
Loop

M = Col_Look + CStr(Row_Begin)
Columns(Col_Look).ClearContents
For i = 1 To N
Range(M).Offset(i - 1, 0) = Mas(i)
Next


Файл с решением здесь. Sluch.xls (2.31 Mб) Большой размер файла из-за того, что взят максимальный предел задачи N = 65536
В приложении описание работы генератора случайных чисел из справочной системы VBA.



Приложение:
Randomize Statement Example
This example uses the Randomize statement to initialize the random-number generator. Because the number argument has been omitted, Randomize uses the return value from the Timer function as the new seed value.

Dim MyValue
Randomize ' Initialize random-number generator.

MyValue = Int((6 * Rnd) + 1) ' Generate random value between 1 and 6.
5
Большое Спасибо Megaloman !!!!<br>(воспользовался вторым ответом более лёгким для чайника)<br>Думаю скоро смогу понять и Ваше решение !<br>Ещё раз Спасибо!!!<br><br>
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
21.02.2010, 12:29
общий
это ответ
Здравствуйте, DimasaN.

Можно сделать таким методом (буду считать, что числа записаны в столбике A, начиная с первой строки): напротив первого числа в соседнем столбике (B) пишем формулу
=СЛЧИС()*100000
Потом кликаем 2 раза в правом нижнем углу ячейки с формулой (B1), таким образом, весь столбик B заполнится случайными числами. После этого делаете активной ячейку B1 и нажимаете кнопку "Сортировка по возрастанию" или "Сортировка по убыванию". Исходный массив перемешался, можем удалять значения в столбике B (выделяем весь и удаляем).

Удачи!
5
Круто Большой Рахмат так просто и круто ну и ну !!!!!!!!вот это да !!!!!!!!!!!!!!!
Неизвестный
21.02.2010, 15:36
общий
это ответ
Здравствуйте, DimasaN.
Максимальное количество строк - 65536 (миллион из условия - не для excel ).
Заполнить соседнюю ячейку случайными значениями (=СЛЧИС()) и, выделив оба столбца, отсортировать в любом порядке (по возрастанию/убыванию) второго столбца.
Нужно заметить, что функция СЛЧИС() генерирует ПСЕВДОслучайную последовательность - так что после сортировки вы получите ПСЕВДОслучайный порядок ваших исходных данных.
давно
Модератор
137394
1850
21.02.2010, 17:40
общий
DimasaN:
Вне всякого сомнения, ответ Устинов С.Е., Профессионал очень эффектный и эффективный. И обошлось без Программирование/ Basic/VBA. Правда, не известна конечная цель задачи ...
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа