Страница: 1 | 2 |
Вопрос: генерация случайных чисел
Добавлено: 20.08.07 14:57
Автор вопроса: APS | ICQ: 234458121
Ответы
Всего ответов: 25
Номер ответа: 16
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #16
Добавлено: 08.10.07 13:54
Мне интересно знать, чем по Вашему мнению плохо решение через коллекцию?
Номер ответа: 17
Автор ответа:
ADSemenov.ru
Вопросов: 5
Ответов: 276
Web-сайт:
Профиль | | #17
Добавлено: 08.10.07 14:32
____ Вопрос "хуже или лучше", я думаю, имеет смысл рассматривать только с позиции быстродействия (если всё работает, как надо).
____ Коллекция, полагаю, по времени дольше работает при больших объёмах.
Номер ответа: 18
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #18
Добавлено: 08.10.07 15:53
To Sharp: Есть ли еще какие-либо иные причины полагать, что решение через коллекцию - это хуже некуда?
Номер ответа: 19
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #19
Добавлено: 09.10.07 21:46
Во-первых, коллекцию сначала надо сформировать, нельзя использовать уже имеющиеся данные в массиве
Во-вторых, над данными осуществляется операция записи, а не только чтения (т.к. они модифицируются)
В-третьих, коллекция, как было верно замечено, имеет проблемы с быстродействием
Другими словами этот метод имеет все возможные недостатки.
Номер ответа: 20
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #20
Добавлено: 09.10.07 23:56
Во-вторых, над данными осуществляется операция записи, а не только чтения (т.к. они модифицируются)
Понятно... я уж, грешным делом, был готов подумать, что, действительно, все так плохо, что дальше некуда...
Лично же для меня, решение через коллекцию вполне приемлемо, т.к. довольно легко и быстро реализуется, что, как я думаю, может скомпенсировать все последующие потери во времени из-за разницы быстродействия (которую (разницу) уловить "на глаз" конечного пользователя будет весьма сложно).
Однако же, я сожалею, что другого полностью работающего варианта (в том числе и по Вашему алгоритму) кода именно на VBA здесь пока не предложено...
Номер ответа: 21
Автор ответа:
GenyaA
Вопросов: 0
Ответов: 185
Web-сайт:
Профиль | | #21
Добавлено: 10.10.07 00:39
Решил предложить еще один вариант для сравнения... немного поунивесализировал. Кажется, получилось похоже на логику варианта от Sharp'a.
В этом варианте количество вопросов задается размером области Range (может быть любой, но в один столбец), а количество выбранных вариантов размерностью массива m.
Dim m(1 To 5) As String, i As Integer, q As Variant
'считаем в массив ячейки с вопросами
q = Range("A2:A11"
'выберем случайные неповторяющиеся варианты
For i = 1 To UBound(m)
f = CInt(((UBound(q, 1) + 1 - i) * Rnd(Now) - 0.5) + 1)
m(i) = q(f, 1)
q(f, 1) = q(UBound(q, 1) + 1 - i, 1)
Debug.Print m(i)
Next i
End Sub
Номер ответа: 22
Автор ответа:
Кверт
Вопросов: 2
Ответов: 14
Профиль | | #22
Добавлено: 19.10.07 13:38
Функция из книги А.Гладкий, А.Чиртик Трюки и эффекты Excel.
Dim intRow As Integer ' Номер текущей строки
Dim intCol As Integer ' Номер текущего столбца
Dim avarOut() As Variant ' Выходной массив (двумерный)
Dim avarValues() As Variant ' Массив с возможными значениями
Dim intValCount As Integer ' Количество возможных значений
Dim cell As Range
Dim i As Integer
ReDim avarOut(1 To Application.Caller.Rows.Count, 1 To _
Application.Caller.Columns.Count)
' Всего нужно чисел...
intValCount = rgSource.Rows.Count * rgSource.Columns.Count
ReDim avarValues(1 To intValCount)
' Заполнение массива avarValues значениями из указанного _
диапазона
For Each cell In rgSource
i = i + 1
avarValues(i) = cell.Value
Next cell
' Занесение значений в выходной массив avarOut, в произвольном _
порядке выбирая их из avarValues
Randomize
For intRow = 1 To Application.Caller.Rows.Count
For intCol = 1 To Application.Caller.Columns.Count
' Определение номера элемента из avarValues
i = Rnd * intValCount
If i = 0 Then i = 1
' Занесение этого элемента в выходной массив
avarOut(intRow, intCol) = avarValues(i)
Next intCol
Next intRow
' Возвращение массива значений
dhGetRandomValues1 = avarOut
End Function
- в случайном порядке генерируются числа, взятые из опред.диапазона, и возвращаются в виде массива.
P.S.
Этот пример и другие из этой книги - слегка измененные - я встречал в другой книге: Уокенбах Джон. Профессиональное программирование на VBA в Excel 2002
Номер ответа: 23
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #23
Добавлено: 28.10.07 12:35
Public Function GetRandom(Of T)(ByVal source As List(Of t)) As t
Return source(RndInt(source.Count))
End Function
<Extension()> _
Public Function GetRandom(Of T)(ByVal source As T()) As T
Return source(RndInt(source.Length))
End Function
<Extension()> _
Public Function GetRandom(Of T)(ByVal source As IEnumerable(Of T)) As T
Return GetRandom(source.ToArray)
End Function
<Extension()> _
Public Function GetRandom(Of T)(ByVal source As T(), ByVal count As Integer) As T()
Dim TempArr = CType(source.Clone, T())
Dim Result(count - 1) As T
For i = 0 To count - 1
Dim Pos = RndInt(source.Length - i - 1)
Result(i) = TempArr(Pos)
TempArr(Pos) = TempArr(TempArr.Count - 1 - i)
Next
Return Result
End Function
<Extension()> _
Public Function GetRandom(Of T)(ByVal source As List(Of T), ByVal count As Integer) As List(Of T)
Dim TempList = New List(Of T)
TempList.AddRange(source)
Dim Result As New List(Of T)
For i = 0 To count - 1
Dim Pos = RndInt(TempList.Count - 1)
Result.Add(TempList(Pos))
TempList.RemoveAt(Pos)
Next
Return Result
End Function
<Extension()> _
Public Function GetRandom(Of T)(ByVal source As IEnumerable(Of T), ByVal count As Integer) As IEnumerable(Of T)
Return GetRandom(source.ToArray, count)
End Function
<Extension()> _
Public Function GetAllRandom(Of T)(ByVal source As T()) As T()
Return GetRandom(source, source.Length)
End Function
<Extension()> _
Public Function GetAllRandom(Of T)(ByVal source As List(Of T)) As List(Of T)
Return GetRandom(source, source.Count)
End Function
<Extension()> _
Public Function GetAllRandom(Of T)(ByVal source As IEnumerable(Of T)) As IEnumerable(Of T)
Dim SourceList = source.ToList
Return GetRandom(SourceList, SourceList.Count)
End Function
PS 2 ADSemenov.ru
УБЕЙ СЕБЯ ОП СТЕНУ И ВЫПЕЙ ЙАДУ СО СВОИМИ ПОЛОСКАМИ!!!!!!!!!!
Номер ответа: 24
Автор ответа:
leo
Вопросов: 2
Ответов: 2
Профиль | | #24
Добавлено: 27.05.13 14:27
Подскажите, по какому алгоритму генерируются в общем случае псевдослучайные числа? Только через линейный конгруэнтный генератор или алгоритм тоже каким-то образом из библиотеки выбирается? Каковы значения констант a,c,m в ЛКГ? Благодарю заранее.
Номер ответа: 25
Автор ответа:
AndreyMp
ICQ: 237822510
Вопросов: 28
Ответов: 1182
Профиль | | #25
Добавлено: 01.06.13 15:42
leo прочитай топик с начала. Особенно последний пост Артема.