Remkomplekty.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Rnd vba excel

MS Excel: How to use the RND Function (VBA)

This Excel tutorial explains how to use the Excel RND function with syntax and examples.

Description

The Microsoft Excel RND function returns a random number that is greater than or equal to 0 and less than 1. You can use the RND function in a formula to generate a random number within a range of values.

The RND function is a built-in function in Excel that is categorized as a Math/Trig Function. It can be used as a VBA function (VBA) in Excel. As a VBA function, you can use this function in macro code that is entered through the Microsoft Visual Basic Editor.

Syntax

The syntax for the RND function in Microsoft Excel is:

Parameters or Arguments

Returns

The RND function returns a random number that is greater than or equal to 0 and less than 1.
If the number provided is greater than 0 or the number parameter is omitted, the RND function will return the next random number in the sequence using the previously generated random number as the seed.
If the number is less than 0, the RND function will return a random number using number as the seed.
If the number is 0, the RND function will return the random number that was most recently generated.

Random Integer Range

To create a random integer number between two values (range), you can use the following formula:

Where lowerbound is the smallest number and upperbound is the largest number that you want to generate a random number for.

The formula above would generate an integer random number between 10 and 25.

Applies To

  • Excel for Office 365, Excel 2019, Excel 2016, Excel 2013, Excel 2011 for Mac, Excel 2010, Excel 2007, Excel 2003, Excel XP, Excel 2000

Type of Function

  • VBA function (VBA)

Example (as VBA Function)

The RND function can only be used in VBA code in Microsoft Excel.

Let’s look at some Excel RND function examples and explore how to use the RND function in Excel VBA code:

In this example, the variable called LRandomNumber would now contain a random number between 200 and 300.

Add the Randomize function

If you find that you are not getting a truly random number when calling the RND function, you can use the RANDOMIZE function to change the seed value for the RND function’s random number generator. The call to the RANDOMIZE function should preceed the call to the RND function.

In this example, the variable called LRandomNumber would now contain a random number between 200 and 300. The Randomize function would ensure that the number generated is truly random by initializing the random number generator with a seed value that is equivalent to the system timer.

Warning: If you don’t call the Randomize function before calling the Rnd function, the Rnd function may return the same random number value each time. And therefore, you may not get a truly random number.

Основы VBA: встроенные и пользовательские функции

6.1. Встроенные математические функции

Вы хотите вычислить квадратный корень, округлить число или сделать с ним еще что-нибудь подобное? Для этого VBA имеет специализированные функции, вы можете найти их в табл. 6.1.

Давайте рассмотрим пример. Добавим в документ Microsoft Word кнопку, назовем ее cmd_Calc , надпишем ее как Вычисления и добавим следующий код (листинг 6.1.), иллюстрирующий работу рассмотренных функций.

Обратите внимание на алгоритм получения случайного числа, находящегося в определенном диапазоне, с помощью функции Rnd . Предположим, нам нужно получить случайное число от 15 до 40 . Получим, для начала, число от 0 до 40 . Очевидно, что для этого нам понадобится такой вызов: Rnd ()*40 .

Чтобы «поднять» уровень наименьшего случайного числа, возвращаемого выражением, до 15 , сделаем следующее.

Во-первых, вычислим разность 40 и 15 — у нас получится 25 . Значит, чтобы получить случайное число от 0 до 25 , можно использовать вызов Rnd ()*25 .

Во-вторых, прибавим к полученному случайному числу 15 . Теперь выражение для получения случайного числа от 15 до 40 выглядит так: Rnd ()*25+15 .

Проверим это высказывание на правильность. Функция Rnd , как известно, возвращает случайные числа от 0 до 1 . Если функция возвратит 0 — результат вычисления выражения будет равен 15 (0*25+15) . Если функция возвратит 1 — результат будет равен 40 (25*1+15) . Промежуточные значения Rnd дадут искомые случайные числа между 15 и 40 .

Читать еще:  Как очистить историю видео в одноклассниках

На рис. 6.1. вы можете видеть окно сообщения, содержащее результаты вызовов функции Rnd .

Выше мы работали, в основном, с числами, теперь поговорим о строковых переменных.

6.2. Строковые функции

В табл. 6.2. вы можете найти информацию об основных строковых функциях VBA .

Работа со строками традиционно считается сложным разделом программирования для начинающих, поэтому проиллюстрируем вышеописанные функции примерами.

Создадим документ Microsoft Word и добавим на него следующие кнопки табл. 6.3.

Обработчик нажатия кнопки cmd_Len (листинг 6.2.) будет содержать решение следующей задачи: сообщить пользователю длину введенного текста. Очевидно, для решения этой задачи нам понадобится функция Len .

На рис. 6.2. вы можете видеть результат вычисления длины строки.

Теперь займемся конверсией символов — функциями LCase и UCase (листинг 6. 3.).

На очереди — вырезание символов — функции Mid , LTrim , Rtrim , Left , Right (листинг 6.4.) Среди этих функций наиболее мощной является Mid — используя ее, можно делать со строками очень много всего.

Теперь рассмотрим примеры работы функций Asc , Chr и функции String . Чтобы работать с функциями Asc и Chr нам нужно познакомиться с понятием таблицы символов ASCII .

ASCII расшифровывается как American Standard Code For Information Intercharge — американский стандартный код для обмена информацией. Каждый символ в ASCII закодирован восьмибитным кодом. В результате получается таблица , в которой каждому управляющему символу, цифре, букве латинского или национального алфавитов сопоставлен свой код. Коды записывают в различных представлениях — в основном — в шестнадцатеричном и десятичном. Мы будем пользоваться десятичной записью.

Мы не будем приводить здесь таблицу ASCII полностью, приведем лишь некоторые полезные коды и диапазоны кодов.

Коды в диапазоне 0-31 имеют управляющие символы. Символ возврата каретки (тот самый, который вставляется в документ при нажатии клавиши Enter ) имеет код 13.

Коды в диапазоне 32-127 имеют латинские символы, цифры, знаки препинания — эта часть таблицы остается постоянной для различных кодовых таблиц. Например, пробел имеет код 32, точка — 46. Диапазон 48-57 занимают цифры от 0 до 9, диапазон 65-90 занимают заглавные латинские буквы от A до Z, диапазон 97-122 — строчными буквы a-z.

В диапазоне 128-225 расположены символы национальной кодировки. В русифицированных версиях MS Windows обычно применяется кодовая страница MS Windows 1251. В ней коды 192-223 имеют заглавные буквы от А до Я, 224-255 — строчные буквы от а до я.

Используя коды символов можно вводить в документы (или записывать в файлы, создаваемые программно) символы, которые нельзя ввести с клавиатуры.

В коде обработчика Click для cmd_Asc создадим программу (листинг 6.5.), которая сначала запрашивает у пользователя ввод символа, после чего выводит его ASCII код, потом — ввод кода, после чего выводит соответствующий ему символ. Так же здесь мы посмотрим на то, как работает функция String :

Является ли Excel VBA Rnd() действительно этим плохо?

Мне нужен генератор псевдослучайных чисел для моделирования 2D Монте-Карло, у которого нет характерных гиперплоскостей, которые вы получаете с помощью простых LCG. Я тестировал генератор случайных чисел Rnd() в Excel 2013, используя следующий код (занимает около 5 секунд для запуска):Является ли Excel VBA Rnd() действительно этим плохо?

Вот простой сюжет х против у от выполнения кода

Не только это не очень случайный вид, но и более очевидные гиперплоскости, чем печально известный алгоритм RANDU в 2D. В принципе, я использую функцию неправильно или является функцией Rnd() в VBA на самом деле не самым младшим битом?

Для сравнения, вот что я могу получить для Mersenne Twister MT19937 на C++.

Параметр ‘Функция Randomize’ принимает аргумент, например, ‘Randomize Now()’, но на самом деле, похоже, не имеет никакого значения для вашего заговора. –

ответ

Для получения более генератора случайных чисел и сделать его производительность быстрее, я изменил код так:

я получаю это после построения результата

Результат выглядит лучше, чем вывод вашего кода. Изменение приведенный выше код немного что-то вроде этого

дает лучший результат, чем предыдущий один

Уверенная Вихрь Мерсенна MT19937 в C++ все еще лучше, но последний результат вполне подходит для проведения моделирования Монте-Карло. FWIW, вам может быть интересно прочитать эту статью: On the accuracy of statistical procedures in Microsoft Excel 2010.

Спасибо @ Анастасия — ссылка делает все понятным. Генератор в функции рабочего листа excel RAND() и в VBA, Rnd() различен, а VBA явно уступает. Я думал, что MS улучшила RNG в Excel, но, возможно, только RAND(). Несчастливо, потому что для моделирования MonteCarlo может быть удобно использовать генератор в VBA. – XYZ

Читать еще:  Ole объект excel

@XYZ Я подозреваю, что они оба похожи, так как в VBA нет приложения «Application.WorksheetFunction.Rand()». –

@XYZ Я только что нашел, если вы поместили фиктивную переменную ‘z = Rnd’ между’ x = Rnd’ и ‘y = Rnd’ до моего первого кода сделает результат намного лучше. –

Похоже, что потребуется выполнить в среднем 1000 * 100 * 100 итераций, а VBA обычно немного медленнее, чем собственные формулы Excel. Рассмотрим этот пример

Update

Это не так уж плохо! Это тоже будет работать даже без Randomize

и Single имеет около половины точности Double :

Update 2

я нашел C альтернативу, которая так быстро, как VBA Rnd.
C:WindowsSystem32msvcrt.dll является Microsoft C Runtime библиотеки:

, а затем вы можете использовать его как этот x = rand/32767 в вашем коде:

Спасибо @Slai. Использование 1000 x 100 x 100 итераций было намеренным, хотя — я хочу посмотреть, будет ли результат по-прежнему выглядеть случайным при просмотре небольшой части общего вывода. Однако, когда я использую ваше предложение о вызове [RAND()], я получаю то, что выглядит как качественные случайные числа, но гораздо медленнее получать все 1000 значений. – XYZ

Мое заключение — [RAND()] = высокое качество, возможно, выход Мерсенна Твистера, но болезненно медленный. Rnd = смущающе плохо, должен появиться предупреждающий ярлык. – XYZ

@XYZ это немного сложнее, чем это. Функция Excel «RAND» выглядит быстрее, чем VBA ‘Rnd’, но ее оценка’ [] ‘является медленной. ‘[RAND()]’ является ярлыком VBA для ‘Evaluate (» RAND() «)’. Я также попробовал «x = WorksheetFunction.RandBetween (0, 1234567890)/1234567890′, который немного быстрее, но результаты были такими же плохими, как« Rnd ». Мой совет заключается в том, чтобы делать большинство вычислений с помощью формул Excel, как в моем первом примере, и использовать VBA только для вещей, которые не могут быть выполнены с помощью Excel. – Slai

Как баланс между скоростью и добротой, я думал объединение их любят

Помните, что хорошая энтропия + плохая энтропия = лучшая энтропия.

Rnd vba excel

4351 просмотра

4 ответа

68 Репутация автора

Мне нужен генератор псевдослучайных чисел для 2D симуляции Монте-Карло, который не имеет характерных гиперплоскостей, которые вы получаете с простыми LCG. Я протестировал генератор случайных чисел Rnd () в Excel 2013, используя следующий код (для запуска требуется около 5 секунд):

Вот простой график зависимости x от y от запуска приведенного выше кода

Мало того, что он не очень случайный, он имеет более очевидные гиперплоскости, чем печально известный алгоритм RANDU в 2D. По сути, я использую эту функцию неправильно или функция Rnd () в VBA на самом деле не совсем пригодна для использования?

Для сравнения, вот что я получаю для Mersenne Twister MT19937 в C ++.

Ответы (4)

11 плюса

2056 Репутация автора

Чтобы получить лучший генератор случайных чисел и повысить его производительность, я изменил ваш код следующим образом:

Я получаю это после нанесения результата

Результат выглядит лучше, чем вывод вашего кода. Немного изменив приведенный выше код, примерно так

дает лучший результат, чем предыдущий

Конечно, Mersenne Twister MT19937 в C ++ все еще лучше, но последний результат вполне подходит для моделирования Монте-Карло. FWIW, вам может быть интересно прочитать эту статью: О точности статистических процедур в Microsoft Excel 2010 .

2 плюса

17447 Репутация автора

Кажется, что для выполнения итераций в среднем требуется 1000 * 100 * 100, а VBA обычно немного медленнее, чем собственные формулы Excel. Рассмотрим этот пример

Обновить

Это совсем не так плохо! Это будет работать тоже даже без Randomize

и Single имеет около половины точности Double :

Обновление 2

Я нашел C альтернативу, которая так же быстро, как VBA Rnd.
C:WindowsSystem32msvcrt.dll такое библиотека времени выполнения Microsoft C:

и тогда вы можете использовать это x = rand / 32767 в своем коде следующим образом:

Автор: Slai Размещён: 11.08.2016 01:27

плюса

1288 Репутация автора

Как баланс между скоростью и добротой, я думал объединить их как

Помните, что хорошая энтропия + плохая энтропия = лучшая энтропия.

Тем не менее, только 0,05 мс на [rand ()].

1 плюс

21 Репутация автора

После прочтения этого вопроса мне стало любопытно и я нашел статью Алексея Бочкарева « Оценка пригодности Excel VBA для симуляции Монте-Карло », которая доступна здесь . Функции RAND и RND не рекомендуются, но, как указано в статье, Mersenne Twister был реализован в VBA Джерри Вангом.

Is Excel VBA’s Rnd() really this bad?

I need a pseudo random number generator for 2D Monte Carlo simulation that doesn’t have the characteristic hyperplanes that you get with simple LCGs. I tested the random number generator Rnd() in Excel 2013 using the following code (takes about 5 secs to run):

Читать еще:  Функция дмакс в excel

Here is a simple plot of x vs y from running the above code

Not only is it not very random-looking, it has more obvious hyperplanes than the infamous RANDU algorithm does in 2D. Basically, am I using the function incorrectly or is the Rnd() function in VBA actually not the least bit usable?

For comparison, here’s what I get for the Mersenne Twister MT19937 in C++.

Создан 11 авг. 16 2016-08-11 08:30:38 XYZ

The ‘Randomize’ function takes an argument e.g. ‘Randomize Now()’ but actually doesn’t seem to make a difference to your plot – Robin Mackenzie 11 авг. 16 2016-08-11 08:54:41

3 ответа

To yield a better random generator and to make its performance faster, I modified your code like this:

I obtain this after plotting the result

The result looks better than your code’s output. Modifying the above code a little bit to something like this

yields a better result than the previous one

Sure the Mersenne Twister MT19937 in C++ is still better, but the last result is quite good for conducting Monte-Carlo simulations. FWIW, you might be interested in reading this paper: On the accuracy of statistical procedures in Microsoft Excel 2010.

Thanks @Anastasiya — the reference makes things clear. The generator in the excel worksheet function RAND() and in VBA, Rnd() are different, and the VBA one is clearly inferior. I thought that MS had improved the RNG in excel but perhaps only the RAND() one. Unfortunate because for MonteCarlo simulation it can be convenient to use a generator in VBA. – XYZ 11 авг. 16 2016-08-11 11:58:37

@XYZ I suspect they’re both similar as there’s no ‘Application.WorksheetFunction.Rand()’ in VBA – Anastasiya-Romanova 秀 11 авг. 16 2016-08-11 12:04:57

@XYZ I’ve just found if you put a dummy variable ‘z = Rnd’ between ‘x = Rnd’ and ‘y = Rnd’ to my first code will make the result much better. – Anastasiya-Romanova 秀 11 авг. 16 2016-08-11 12:15:17

I tested the code and although it does look a bit better, when I sorted the values, of the 1000 points, only 388 were unique (around 60% of them are duplicates). – XYZ 11 авг. 16 2016-08-11 22:44:19

That seems like it would take on average 1000 * 100 * 100 iterations to complete and VBA is usually a bit slower than native Excel formulas. Consider this example

Update

It’s not that bad at all! This will work too even without Randomize

and Single has about half of the precision of Double :

Update 2

I found C alternative that is as fast as VBA Rnd.
C:WindowsSystem32msvcrt.dll is the Microsoft C Runtime Library:

and then you can use it like this x = rand / 32767 in your code:

Создан 11 авг. 16 2016-08-11 13:27:29 Slai

Thanks @Slai. Using 1000 x 100 x 100 iterations was intentional though — I want to see whether the output still looks random when looking at a small section of the overall output. However, when I use your suggestion of calling [RAND()], I get what looks like high-quality random numbers but it is much slower to get all 1000 values. – XYZ 12 авг. 16 2016-08-12 00:55:32

My conclusion is [RAND()] = high quality perhaps Mersenne Twister output, but painfully slow. Rnd = embarrassingly bad, should come with a warning label. – XYZ 12 авг. 16 2016-08-12 00:59:32

@XYZ it’s a bit more complicated than that. The Excel function ‘RAND’ seems faster than the VBA ‘Rnd’, but evaluating it ‘[]’ is the slow part. ‘[RAND()]’ is the VBA shortcut for ‘Evaluate(«RAND()»)’. I also tried ‘x = WorksheetFunction.RandBetween(0, 1234567890) / 1234567890’ which is a bit faster but the results were as bad as ‘Rnd’. My advice is to do most of the calculations with Excel formulas like in my first example, and use VBA just for the things that can’t be done with Excel. – Slai 12 авг. 16 2016-08-12 13:21:34

As a balance between speed and goodness, I was thinking of combining them like

Remember that good entropy + bad entropy = better entropy.

That said, only 0.05ms per [rand()].

Создан 04 июл. 17 2017-07-04 02:26:07 Tuntable

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×