Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: генерация случайных чисел Добавлено: 20.08.07 14:57  

Автор вопроса:  APS | ICQ: 234458121 

Ответить

  Ответы Всего ответов: 25  

Номер ответа: 16
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #16
Добавлено: 08.10.07 13:54
Хуже варианта с коллекциями вообще сложно придумать.

Мне интересно знать, чем по Вашему мнению плохо решение через коллекцию?

Ответить

Номер ответа: 17
Автор ответа:
 ADSemenov.ru



Вопросов: 5
Ответов: 276
 Web-сайт: www.adsemenov.ru
 Профиль | | #17
Добавлено: 08.10.07 14:32
____ Вопрос "хуже или лучше", я думаю, имеет смысл рассматривать только с позиции быстродействия (если всё работает, как надо).
____ Коллекция, полагаю, по времени дольше работает при больших объёмах.

Ответить

Номер ответа: 18
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #18
Добавлено: 08.10.07 15:53
Коллекция, полагаю, по времени дольше работает при больших объёмах.


To Sharp: Есть ли еще какие-либо иные причины полагать, что решение через коллекцию - это хуже некуда?

Ответить

Номер ответа: 19
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #19
Добавлено: 09.10.07 21:46
Во-первых, коллекцию сначала надо сформировать, нельзя использовать уже имеющиеся данные в массиве
Во-вторых, над данными осуществляется операция записи, а не только чтения (т.к. они модифицируются)
В-третьих, коллекция, как было верно замечено, имеет проблемы с быстродействием

Другими словами этот метод имеет все возможные недостатки.

Ответить

Номер ответа: 20
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #20
Добавлено: 09.10.07 23:56
Во-первых, коллекцию сначала надо сформировать, нельзя использовать уже имеющиеся данные в массиве
Во-вторых, над данными осуществляется операция записи, а не только чтения (т.к. они модифицируются)

Понятно... я уж, грешным делом, был готов подумать, что, действительно, все так плохо, что дальше некуда... ;-)

Лично же для меня, решение через коллекцию вполне приемлемо, т.к. довольно легко и быстро реализуется, что, как я думаю, может скомпенсировать все последующие потери во времени из-за разницы быстродействия (которую (разницу) уловить "на глаз" конечного пользователя будет весьма сложно).

Однако же, я сожалею, что другого полностью работающего варианта (в том числе и по Вашему алгоритму) кода именно на VBA здесь пока не предложено...

Ответить

Номер ответа: 21
Автор ответа:
 GenyaA



Вопросов: 0
Ответов: 185
 Web-сайт: www.genyaa.nm.ru
 Профиль | | #21
Добавлено: 10.10.07 00:39
Решил предложить еще один вариант для сравнения... немного поунивесализировал. Кажется, получилось похоже на логику варианта от Sharp'a. ;-)

В этом варианте количество вопросов задается размером области Range (может быть любой, но в один столбец), а количество выбранных вариантов размерностью массива m.

Sub nnn()
    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.
Function dhGetRandomValues1(rgSource As Range) As Variant
   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
    <Extension()> _
    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 прочитай топик с начала. Особенно последний пост Артема.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам