Забавная задачка:
Используя генератор Rnd, написать ф-ю, которая возвращала бы значения 1, 2 или 3 с равной вероятностью. Код для подсчета вероятностей можно использовать вроде этого: Код:
Dim Value(4) |
хммм, ну вероятность ты подсчитал, а где сама функция генерации самого числа по подсчитанным результатам?...
есть кривая (не помню какого ученого) показывающая, что числа в середине промежутка выпадают чаще, чем по краям, это уже давно всем известно... :rolleyes: |
Цитата:
Формулу надо бы по идее вписать вместо "Rnd(3)" Цитата:
:lol: Ладно, раз номер не прошел, тогда так: Создать, на основе Rnd() ф-ю, которая возвращала бы 1,2 или 3 с близкой вероятностью. P.S. Сядьте и потестите варианты; не зря ведь говорю, не просто прикалываюсь: последовательности вероятностей можно получить очень интригующие. ;) |
ну, я бы увеличил бы границы допустим в 10 раз (чем больше, тем мы больше растянем график, и сделаем его плавней), и пустил бы цикл, пока результат бы не попадал в нужные пределы... типа:
Код:
Dim Value(4) в алгоритме есть охренительный недостаток... будет очень медленно работать... можно еще разорвать этот график и сложить его... порвать посередине и первый после среднего элемента прибавить к первому сначала и т.п... но это только графически, а как это кодом замутить - хз... |
Ну если использовать счетчики как в первом примере, то можно найти в них наибольщую и наименьшую вероятность и если они отличаются друг от друга больше ну скажем чем на заданную величину (например 5%) то возвращать число которое соответствует наименьшей вероятности, а если разница меньше заданной то использовать оператор Rand()
Больше ничего в голову не лезет :) |
ага, придумал как график рвать:
Код:
Dim Value(4) надо теперь совместить два метода и все. ;) |
Вах, хитрые методы! У меня всё намного прозаичнее, даже стыдно становится выкладывать свою идею...
Давайте, еще подожду пару идей- и раскроюсь, если не отгадаете... А если придумаете лучше- выдам за свою идею!/шутка/:)) P.S. Задачка хоть и прикол, но ИМХО вопрос довольно важен. Многое делается с помощью псевдослучайных чисел Rnd(), и важно, чтоб они были действительно хоть и псевдо-, но случайными... :) |
совместив два метода получил следующий:
Код:
Dim Value(4) |
А вот что я придумал :
Код:
Dim Value(4) |
последние коды - в ФАК однозначно!
|
|
1. Прост до глупости. Работает соответственно. :)
Код:
Dim Value(4) Код:
Dim Value(4) |
По моему вообже не надо никаких новых функций, до этого мы еще вчера с SubZer0 додумались, надо просто вызывать функцию Rnd следующим образом:
Код:
Rnd(0.5,3.5) Просто в твоем первом примере на числа 1 и 2 отводился промежуток в два раза меньше, чем на 2 (от 1 до 1.5 - для единици, от 1.5 до 2.5 - для двойки и 2.5 до 3 для тройки). |
кстати в задаче был маленький подвох, я только сейчас додумался...
попробуйте запустить вот такой код... Код:
seedrnd millisecs() |
:))
Не считая крайних, он и не дает. Но на малом диапазоне эти крайние могут сильно портить нервы, если не юзать "хитрометоды". Зато теперь таких приемов предостаточно: и больше никто не будет ломать голову и ценное оборудование. :ok: Кстати, если генератор случайных, работающий в заданом узком диапазоне, вызывается изредка и асинхронно (к примеру, для выбора фразы-ответа юнита или там анимации падения врага), то проще вообще юзать что то подобное: Код:
Dim Value(4) |
Часовой пояс GMT +4, время: 07:09. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot