Страница: 1 |
Страница: 1 |
Вопрос: При генерации массива проверять на повторения
Добавлено: 01.05.08 22:08
Автор вопроса: Boron
Не могли бы подсказать, как сделать следующую задачу (сам решить её не могу):
Генерируется массив (9). Каждое значение массива генерируется случайным образом от 0 до 35.
Нужно сделать так, чтобы в случае, если новое значение уже идентично предыдущим, то оно генерируется заново.
Можно тупо сделать If Array(1) > Array (0) Then... Но согласитесь, это неправильный подход.
Кто-нибудь может помочь?
Dim Array(9)
Dim i
For i = 0 To 9
Array(i) = Int(Rnd() * 35)
Cells(i + 1, 10) = Array(i)
Next i
Спасибо!
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
Boron
Вопросов: 5
Ответов: 12
Профиль | | #1
Добавлено: 01.05.08 22:09
Извиняюсь за дубль, кнопку мыши заклинило. Удалите пожалуйста 1 тему.
Номер ответа: 2
Автор ответа:
J. Smith
ICQ: ненавижу
Вопросов: 40
Ответов: 477
Web-сайт:
Профиль | | #2
Добавлено: 02.05.08 14:10
Sub Macros1()
Const Delim = ","
Dim Arrayy(9)
Dim i
Dim tmpArr As String
Dim tmpRND As Integer
For i = 0 To 9
TryNext:
tmpRND = Rnd * 35
'если такой цифры ещё нет в массиве то
If InStr(tmpArr, CStr(tmpRND)) = 0 Then
'добавить во временную строку
tmpArr = tmpArr & Delim & CStr(tmpRND)
'копировать в массив
Arrayy(i) = tmpRND
'занести в ячейку
Cells(i + 1, 10) = tmpRND
'если есть то взять следующую из РНД
Else: GoTo TryNext
End If
Next i
End Sub
тут демонофф вроде привел нормальный пример для осмысления, а ты не понял
Номер ответа: 3
Автор ответа:
Boron
Вопросов: 5
Ответов: 12
Профиль | | #3
Добавлено: 02.05.08 19:09
Adam Smith, огромное спасибо за ответ! А как всё просто оказалось.
А по поводу примера Демоноффа: на сайте не нашёл функции поиска, да и гугл тоже не выдавал мне ссылок на его примеры.
Номер ответа: 4
Автор ответа:
J. Smith
ICQ: ненавижу
Вопросов: 40
Ответов: 477
Web-сайт:
Профиль | | #4
Добавлено: 02.05.08 19:46
Имел ввиду ответ ADSemenov-а на вопрос про переменную в Лоадпикчер.
Он както ответил мне также, Чётко, и я тогда любя про себя, Демонофф он и всё тут
Семенов, и щас Ваш ответ помню...
С уважением Адам.
офтоп...
Номер ответа: 5
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #5
Добавлено: 02.05.08 21:00
Интересен алгоритм наибыстрого решения проблемы. Полагаю, что наибыстрым для любого количества значений будет алгоритм "двух циклов".
1. Формируем массив значений, участвующих в необходимом результате — в нашем случае числа от 0 до 35.
2. Проходим циклом весь массив и для каждого значения находим случайное число, допустимый индекс в массиве, не равное индексу текущего значения. Меняем местами два значения в массиве.
После этих двух циклов все значения в массиве будут случайным образом перемешаны. Неповторимость, если она нужна, обеспечивается в первом цикле.
Номер ответа: 6
Автор ответа:
J. Smith
ICQ: ненавижу
Вопросов: 40
Ответов: 477
Web-сайт:
Профиль | | #6
Добавлено: 02.05.08 21:09
Не утверждаю что мой метод наибыстрейший, а результат моего макроса вообще интересный получается
Я Randomize Timer забыл
Номер ответа: 7
Автор ответа:
Boron
Вопросов: 5
Ответов: 12
Профиль | | #7
Добавлено: 03.05.08 10:49
Adam Smith, а, ты про тот ответ
На самом деле, конкретно в моём случае, вариант ADSemenov.ru в LoadPicture не сработал (я кстати изначально таким способом пробовал и сам, просто сразу вспомнилась аналогия с MsgBox("Bla-bla-bla" & Var & "Bla-bla-bla".
P.S. Код моей ситуации опубликовать уже не смогу, т.к. всё переписал другим способом.
За ответы спасибо!