Slant-shadow Posted December 6, 2016 Report Share Posted December 6, 2016 Всем привет. Может кто-нибудь помочь с написанием функции VBA возвращающей случайным образом с равной вероятностью тризначения – 0, 1 или 2. Quote Link to comment Share on other sites More sharing options...
NatM Posted December 7, 2016 Report Share Posted December 7, 2016 Я бы попробовала, может замороченно, но так: сложить все цифры текущего времени включая секунды до одной цифры. Затем разделить на 3 и оставшееся число после деления будет либо 0, либо 1, либо 2. Повтор будет через 3 секунды. Первое, что пришло в голову.. . Quote Link to comment Share on other sites More sharing options...
NatM Posted December 7, 2016 Report Share Posted December 7, 2016 Function N_012() As Byte N_012 = Timer() Mod 3 End Function Так это выглядит программно Quote Link to comment Share on other sites More sharing options...
Slant-shadow Posted December 7, 2016 Author Report Share Posted December 7, 2016 А время-то тут причем? Quote Link to comment Share on other sites More sharing options...
NatM Posted December 8, 2016 Report Share Posted December 8, 2016 (edited) Обеспечивает равную вероятность появления трех цифр. Псевдослучайно. Можно, конечно так: Randomize Int(Rnd () * 10) mod 3 Но на самом деле, это тоже псевдослучайное число. Edited December 8, 2016 by NatM Quote Link to comment Share on other sites More sharing options...
AbraShwabraKadabra Posted December 9, 2016 Report Share Posted December 9, 2016 В 08.12.2016 в 06:38, NatM сказал: Int(Rnd () * 10) mod 3 А ничего, что он тройки выдает? Надо Int(rnd*3) Quote Link to comment Share on other sites More sharing options...
NatM Posted December 9, 2016 Report Share Posted December 9, 2016 (edited) Не выдает. Проверила. И не может выдавать Остаток деления на 3 уж никак не может быть 3. Edited December 9, 2016 by NatM Quote Link to comment Share on other sites More sharing options...
AbraShwabraKadabra Posted December 9, 2016 Report Share Posted December 9, 2016 Int(Rnd*10) - результат 0-0 1-1 2-2 3-0 4-1 5-2 6-0 7-1 8-2 9-0 Итого 0 - 40% 1-30% 2 - 30% Quote Link to comment Share on other sites More sharing options...
NatM Posted December 9, 2016 Report Share Posted December 9, 2016 А потому, вначале я предлагала плясать от таймера - там повторение через 3 секунды Quote Link to comment Share on other sites More sharing options...
AbraShwabraKadabra Posted December 12, 2016 Report Share Posted December 12, 2016 Timer вообще-то дает дробные части секунды. Можно сначала умножить на 1000, а уж потом mod 3. Тогда генерить будет довольно хорошо. Quote Link to comment Share on other sites More sharing options...
NatM Posted December 12, 2016 Report Share Posted December 12, 2016 Таймер дает количество секунд с начала суток. Соответственно, умножать ничего не надо. Я проверяла, что работает как надо, прежде чем сюда писать. Ощущение, что вы наобум пишете сообщения. Троллите? Quote Link to comment Share on other sites More sharing options...
Slant-shadow Posted December 16, 2016 Author Report Share Posted December 16, 2016 А так можно? Dim lRundNum As Long, lMinNum As Long, lMaxNum As Long lMinNum = 0: lMaxNum = 2 Randomize lRundNum = Int(lMinNum + (Rnd() * lMaxNum)) MsgBox lRundNum Quote Link to comment Share on other sites More sharing options...
NatM Posted December 17, 2016 Report Share Posted December 17, 2016 Так вам может вернуть 3. Функция Rnd возвращает от 0 до 1.5 включительно, как я поняла. И, уже не об ошибке, а программировании: не понимаю, зачем делать лишнюю операцию. Сложение с нулем ничего не дает. Quote Link to comment Share on other sites More sharing options...
Slant-shadow Posted December 17, 2016 Author Report Share Posted December 17, 2016 9 часов назад, NatM сказал: Так вам может вернуть 3. Не возвращает 3. Даже 2 не возвращает. Чтобы возвращало два нужно изменить значение переменной lMaxNum на 3. И тогда lRundNum = Int(Rnd() * lMaxNum) Quote Link to comment Share on other sites More sharing options...
NatM Posted December 17, 2016 Report Share Posted December 17, 2016 Прошу прощения. Я перепутала: Rnd возвращает до 1, а не до 1,5 включительно. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.