Страницы: 1
RSS
Рандом Вихрь Мерсенна для ВБА, Как указать на какие значение, и это значение вставить в переменную?
 
Здравствуйте уважаемые Форумчане. До этого для блочного моделирования потока случайных чисел использовал стандартные функции экселя 2007,
такие как :
Randomize (один раз перед открытием файла)
t = Int((64 * Rnd) + 1)
t = CInt(Int((64 * Rnd()) + 1))
t = Fix(Int((64 * Rnd()) + 1))
t = Application.RandBetween(1, 64)

К сожалению получаются немного предсказуемые блоки.  Узнал , что Mersenne Twister (рандом Вихрь Мерсенна) более интересный , сложный рандом , и его используют разработчики excel начиная с версии эксель  2010 в функциях =RAND(), =СЛЧИС(), но у меня 2007
Нашёл в интернете код на вба , но не могу понять  как указать на киакие числа проводить рандомизацию и как сохранить это число в переменную.
Подскажите пожалуйста !
                                                                                                                                   
 
Доброе время суток.
Попробуйте генератор случайных чисел из Net Framework, вдруг будет более случайным?
Код
Public Sub RandomGenerate()
    Dim pRandom As Object, i As Long
    Set pRandom = CreateObject("System.Random")
    For i = 1 To 100
        Debug.Print pRandom.NextDouble & " or long " & pRandom.Next
    Next
End Sub
 
Спасибо, попробую
                                                                                                                                   
 
Можно тоже использовать функцию 'rand' из msvcrt runtime library
Код
Option Explicit

Declare Function rand Lib "msvcrt" () As Long

Sub rand_msvcrt()
    Dim i&, j%, psevdosluchaynoye_chislo
    For i = 1 To 10
        For j = 1 To 10
            psevdosluchaynoye_chislo = rand / 32767 'diapazon 0 - 1
            Cells(i, j).Value = psevdosluchaynoye_chislo
        Next
    Next i
End Sub
Изменено: ocet p - 15.02.2019 17:07:21
 
Цитата
ocet p написал:
msvcrt runtime library
Если уходить в WinAPI, то можно ещё и так по серьёзному CryptGenRandom
 
Спасибо за помощь. Но мне интересны не любые рандомные числа, а к примеру числа указанного мною диапазона чисел, от 1 до 64.
                                                                                                                                   
 
Так тут-то достаточно школьного понятия масштаба :)
Код
Debug.Print CLng(63 * pRandom.NextDouble) + 1
 
Спасибо Андрей VG надо потестить. Я сделал так :
Код
Public Sub RandomGenerate()
    Dim pRandom As Object, i As Byte, t
    Set pRandom = CreateObject("System.Random")
    For i = 1 To 100
        t = pRandom.Next_2(1, 64)
    Next
End Sub

Я перекопал почти весь иннет но, знающих по моей теме рандома  Mersenne Twister на vba почти нет.
                                                                                                                                   
 
а чем RND не RND?
это ощущения или у Вас появились математические доказательства? можно с ними познакомиться, потому что я как-то по-старинке использую RND везде, где мне нужны случайные числа
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Да Игорь , без надобности я эту тему не поднимал-бы. У меня на тесте меня на тесте на данный момент 30 книг и в каждой книге по 33000 блока это около 17000000 значений и после некоторых моих манипуляций у 30 книг вырисовывается  похожий результат. Это не новинка , что rnd плох для блочной рандомизации. И я захотел найти ей функции замену.
Эти показывают немного получше результат:
Randomize(инициализировать только один раз , это в начале главного кода))
Код
  For i = 1 To 100
 't = Int((64 * Rnd) + 1)
 't = CInt(Int((64 * Rnd()) + 1))
 't = Application.RandBetween(1, 64)
 't = pRandom.Next_2(1, 64)
 't = CLng(63 * pRand.NextDouble) + 1
 arr(b, d) = Mid(q(t), 1, 1)
 arr(b, d + 1) = Mid(q(t), 2, 1)
 arr(b, d + 2) = Mid(q(t), 3, 1)
 b = b + 1
      Next i

А  когда я использовал этот, ВООБЩЕ ОЧЕНЬ ПЛОХИЕ ПОКАЗАТЕЛИ:
Код
For i = 1 To 100
Randomize
 t = Int((64 * Rnd) + 1)
next i

Вот меня очень заинтересовал рандом Вихрь Мерсенна !
                                                                                                                                   
 
любой рандом плох для любой рандомизации если рассмотреть 2 случайных значения и делать из этого выводы
рассмотрите  значений ^ значений при значений больше 5 и проанализируйте результаты
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Я уже десятки раз смотрел и сделал такие выводы. И эти выводы основываются не от двух случайных значений, а на основании анализа и конечного результата 500000000 значений.
Спасибо за советы.

Извините , но я тему указал , меня интересует если кто сможет помочь в алгоритме Mersenne Twister (рандом Вихрь Мерсенна) куда указать диапазон значений и переменную для сохранения значения , xlsb файл прикрепил к первому сообщению
                                                                                                                                   
 
Пример использования в собственном коде в Module1 (инициализацию смотрите в методах, начинающихся с init_). Основной метод генерации на лист MTrandom
 
Андрей VG Спасибо за помощь. Но я понял , что мне будет сложно этот код заточить под свои нужды, проще установить эксель 2010 или 2013 и прогнать
функцию rand в коде , с 2010 там уже в эту функцию встроен вихрь мерсенна
                                                                                                                                   
 
Цитата
Александр Е написал: А  когда я использовал этот [код], ВООБЩЕ ОЧЕНЬ ПЛОХИЕ ПОКАЗАТЕЛИ
Тема о неслучайных, сообщение №29 - причина дублирования значений
 
т.е. ни математики, ни статистики у Вас нет
есть ощущение что что-то не так
извините, мне не понять Ваших ощущений пока я не "пощупал" их математики

понимаете, где-то на этой или прошлой неделе, нужно было посчитать сколько есть вариантов в лотерее 5 из 36 если минимальное число в розыгрыше равно Х
я это легко посчитал
жаль что это не дает НИКАКИХ гарантий выигрыша и, однозначно, мои знания математики говорят, что нельзя играть в лотерею  
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Привет!
Цитата
Александр Е написал:
мне будет сложно
В Вашем файле основная процедура MTrandom , в ней один цикл, который гоняет genrand_real1, которая использует genrand_signedInt32, которая гоняет genrand_signedInt32 ...
Смело вбивайте комментарии в переводчик!
Сравнение прайсов, таблиц - без настроек
 
Цитата
Inexsu написал:
Смело вбивайте комментарии в переводчик!
Для человека не программирующего и на совесть забывшего математику результат перевода будет мало чем отличаться от английского текста по уровню понимания смысла.
 
Inexsu и Vikktur спасибо. Комментировать написанное другими не хочу, мне это не интересно. Тема закрыта.
                                                                                                                                   
Страницы: 1
Наверх