Slant-shadow

Функция, возвращающая три значения

15 сообщений в этой теме

Всем привет. Может кто-нибудь помочь с написанием функции VBA возвращающей случайным образом с равной вероятностью три
значения – 0, 1 или 2. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я бы попробовала, может замороченно,  но так: сложить все цифры текущего времени включая секунды до одной цифры. Затем разделить на 3 и оставшееся число после деления будет либо 0, либо 1, либо 2. Повтор будет через 3 секунды. 

Первое,  что пришло в голову.. . :)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Function N_012() As Byte
N_012 = Timer() Mod 3
End Function

Так это выглядит программно :)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Обеспечивает равную вероятность появления трех цифр. Псевдослучайно. 

Можно,  конечно так:

 

Randomize

Int(Rnd () * 10) mod 3

 

Но на самом деле,  это тоже псевдослучайное число. 

Изменено пользователем NatM
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не выдает. Проверила. И не может выдавать

 

Остаток деления на 3 уж никак не может быть 3.

Изменено пользователем NatM
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А потому,  вначале я предлагала плясать от таймера - там повторение через 3 секунды :)

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Timer вообще-то дает дробные части секунды. Можно сначала умножить на 1000, а уж потом mod 3. Тогда генерить будет довольно хорошо.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Таймер дает количество секунд с начала суток. Соответственно,  умножать ничего не надо. 

Я проверяла, что работает как надо,  прежде чем сюда писать. Ощущение,  что вы наобум пишете сообщения. Троллите? 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А так можно?

Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long  
lMinNum = 0: lMaxNum = 2  
Randomize  
lRundNum = Int(lMinNum + (Rnd() * lMaxNum))  
MsgBox lRundNum  

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так вам может вернуть 3. Функция Rnd возвращает от 0 до 1.5 включительно,  как я поняла. 

И,  уже не об ошибке,  а программировании: не понимаю,  зачем делать лишнюю операцию. Сложение с нулем ничего не дает. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, NatM сказал:

Так вам может вернуть 3. 

Не возвращает 3. Даже 2 не возвращает.

Чтобы возвращало два нужно изменить значение переменной  lMaxNum на 3.

И тогда

lRundNum = Int(Rnd() * lMaxNum) 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Прошу прощения. Я перепутала: Rnd возвращает до 1, а не до 1,5 включительно. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас