Slant-shadow

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

15 posts in this topic

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

0

Share this post


Link to post
Share on other sites

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

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

0

Share this post


Link to post
Share on other sites
Function N_012() As Byte
N_012 = Timer() Mod 3
End Function

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

0

Share this post


Link to post
Share on other sites

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

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

 

Randomize

Int(Rnd () * 10) mod 3

 

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

Edited by NatM
0

Share this post


Link to post
Share on other sites

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

 

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

Edited by NatM
0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

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

0

Share this post


Link to post
Share on other sites

А так можно?

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

 

0

Share this post


Link to post
Share on other sites

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

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

0

Share this post


Link to post
Share on other sites
9 часов назад, NatM сказал:

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

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

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

И тогда

lRundNum = Int(Rnd() * lMaxNum) 

 

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now