|
Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр |
11.12.2010, 02:17
|
#1
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
ДСВ по таблице
Вот набросал тут реализацию на коленке.
Код на Blitz3D. Прошу комментариев и конструктивнйо критики. Осбенно, с точки зрения ТеорВер-а (т.к. вариант - первый, что пришёл в голову, вполне возможно, я что-то не учёл).
;генератор ДСВ, заданной таблицей от impersonalis (icq 11-999-51-51) Function ImpRnd_DRVBankCreate%(PBankHandle%,turncnt%) Local diskret#=PeekFloat(PBankHandle,0) Local i%,j%,k%,t% Local v# For i=4 To BankSize(PBankHandle)-1 Step 4 v=PeekFloat(PBankHandle,i) If v<diskret diskret=v EndIf Next Local diskret_cnt%=Ceil(1/diskret) Local map%=CreateBank(diskret_cnt*4) k=0 t=0 For i=0 To BankSize(PBankHandle)-1 Step 4 v=Floor(PeekFloat(PBankHandle,i)/diskret) For j=1 To v PokeInt(map,k,t) k=k+4 Next t=t+1 Next For t=1 To turncnt i=Rand(0,diskret_cnt-1)*4 j=Rand(0,diskret_cnt-1)*4 k=PeekInt(map,i) PokeInt(map,i,PeekInt(map,j)) PokeInt(map,j,k) Next Return map End Function Function ImpRnd_DRVGet#(DRVBankHandle%,ValBankHandle%) Local diskret_cnt%=BankSize(DRVBankHandle)/4 Local RINDX%=Rand(0,diskret_cnt-1)*4 Local CaseID%=PeekInt(DRVBankHandle,RINDX) Return PeekFloat(ValBankHandle,CaseID*4) End Function
Собственно, пример решения задачи:
Есть четрые числа: 12, 11.1, 56, 78. Необходимо: случайным образом возвращать числа из набора, учитывая, что веротяность выпадения чисел разная, а именно: 20%, 30%, 40% и 10% соотвественно.
Для наглядности, демо-код, слегка говнокоден:
SeedRnd MilliSecs() Local A#=12 Local S#=11.1 Local D#=56 Local F#=78 Local B%=CreateBank(16) PokeFloat(B,0,0.2) PokeFloat(B,4,0.3) PokeFloat(B,8,0.4) PokeFloat(B,12,0.1) Local V%=CreateBank(16) PokeFloat(V,0,A) PokeFloat(V,4,S) PokeFloat(V,8,D) PokeFloat(V,12,F) Local prob%[4] Local EXPCNT%=100 Local DRVB%=ImpRnd_DRVBankCreate(B,15) For i=1 To EXPCNT Local w#=ImpRnd_DRVGet(DRVB,V) Select w Case A prob[0]=prob[0]+1 Case S prob[1]=prob[1]+1 Case D prob[2]=prob[2]+1 Case F prob[3]=prob[3]+1 End Select Next For i=0 To 3 DebugLog Str(i+1)+"# "+prob[i]+" ~ "+Int(prob[i]*10/Float(EXPCNT))*0.1 Next FreeBank(DRVB) FreeBank(V) FreeBank(B)
Function ImpRnd_DRVBankCreate%(PBankHandle%,turncnt%)
PBankHandle - дескриптор банка, содержащего нормированные вероятности событий. Т.е., в нашем случае, 0.2, 0.3, 0.4 и 0.1.
turncnt - количество перестановок. Вообще говоря, от балды. Т.к.
Возвращает - сгенерированный банк для функции ImpRnd_DRVGet
Function ImpRnd_DRVGet#(DRVBankHandle%,ValBankHandle%)
DRVBankHandle% - банк, сгенерированный функцией ImpRnd_DRVBankCreate
ValBankHandle% - банк, характеризующий каждое событие числом. В наше случае, это 12, 11.1, 56, 78.
Возвращает одно из чисел, указанных в ValBankHandle, с частотой, соотвествующей его веротяности.
Результаты выполнения демо-кода:
1# 23 ~ 0.2
2# 33 ~ 0.3
3# 37 ~ 0.4
4# 7 ~ 0.1
Как видим, каждое число вернулось нужное количество раз.
Аналогичную задачу проверёнм на другой таблице (0.01 0.5 0.09 0.4)
Скорректируем округление в выоде и получим:
для 1000 итераций:
1# 7 ~ 0.01
2# 498 ~ 0.5
3# 84 ~ 0.08
4# 411 ~ 0.41
для 10 000 итераций:
1# 95 ~ 0.01
2# 4964 ~ 0.5
3# 846 ~ 0.08
4# 4095 ~ 0.41
для 100 000 итераций:
1# 991 ~ 0.01
2# 50078 ~ 0.5
3# 8983 ~ 0.09
4# 39948 ~ 0.4
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
11.12.2010, 02:31
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: ДСВ по таблице
Кстати, вот вам подтверждение ЗБЧ (я про последний пример с разным кол-вом итераций)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
11.12.2010, 02:59
|
#3
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: ДСВ по таблице
блин: ДСВ это не ДеньСвятогоВалентина, это ДискретнаяСлучайнаяВеличина
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
11.12.2010, 03:04
|
#4
|
Blitz's Shame !!
Регистрация: 31.03.2007
Сообщений: 3,639
Написано 832 полезных сообщений (для 2,013 пользователей)
|
Ответ: ДСВ по таблице
здорово !! Мне нравится !!
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.12.2010, 12:26
|
#5
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: ДСВ по таблице
|
(Offline)
|
|
Эти 7 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
11.12.2010, 16:10
|
#6
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: ДСВ по таблице
Дискретная Случайная Величина
Закон Больших Чисел
What The Fuck
Че тут непонятного? Гоу в универ на тех. специальность.
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо .Squid за это полезное сообщение:
|
|
11.12.2010, 21:14
|
#7
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: ДСВ по таблице
Function ImpRnd_DRVBankNormalize(NNBankHandle%) Local Total%=0 Local i% For i=0 To BankSize(NNBankHandle)-1 Step 4 Total=Total+PeekFloat(NNBankHandle,i) Next For i=0 To BankSize(NNBankHandle)-1 Step 4 Local v#=PeekFloat(NNBankHandle,i) PokeFloat(NNBankHandle,i,v/Float(Total)) Next End Function
Перерассчитывает коэффициенты в банке. На вход можно подать ненормированную веротяность (т.е. тупо кол-во реализаций события в серии экспериментов).
Для рассмотренного в 1ом посте, код можно переписать как:
Local B%=CreateBank(16)
PokeFloat(B,0,2)
PokeFloat(B,4,3)
PokeFloat(B,8,4)
PokeFloat(B,12,1)
ImpRnd_DRVBankNormalize(B)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:59.
|