Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2012, 00:32   #11
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

rand()%100 - принимает целые значения [0..99], поделив на 100 получим [0..0.99]
Kostia вне форума Ответить с цитированием
Старый 16.01.2012, 00:43   #12
13th
Форумчанин
 
Аватар для 13th
 
Регистрация: 31.12.2008
Сообщений: 634
По умолчанию

ааа вот оно что .

Ладно . теперь я понял. кстати я сам сейчас провел опыт на кубике (6 граней)

Код:
<?php
	
	$total_tryes = 100000;
	
	$result = array('1'=>0,'2'=>0,'3'=>0,'4'=>0,'5'=>0,'6'=>0,);
	
	for($i=0;$i<$total_tryes;$i++){
	
		$rand = rand(1,6);
		switch($rand){
			case 1 : $result[$rand]++; break;
			case 2 : $result[$rand]++; break;
			case 3 : $result[$rand]++; break;
			case 4 : $result[$rand]++; break;
			case 5 : $result[$rand]++; break;
			case 6 : $result[$rand]++; break;
		}
		
	}
	
	$result = array('1'=>$result['1']/$total_tryes,'2'=>$result['2']/$total_tryes,'3'=>$result['3']/$total_tryes,'4'=>$result['4']/$total_tryes,'5'=>$result['5']/$total_tryes,'6'=>$result['6']/$total_tryes,);
	
	echo '<pre>';
		print_r($result);
	echo '</pre>';
	
//по формуле количество положительных попыток к общему количеству попыток
	$result = array('1'=>1/6/$total_tryes,'2'=>1/6/$total_tryes,'3'=>1/6/$total_tryes,'4'=>1/6/$total_tryes,'5'=>1/6/$total_tryes,'6'=>1/6/$total_tryes,);
	
	echo '<pre>';
		print_r($result);
	echo '</pre>';
	
 ?>
чем больше количество попыток, тем более усредненный результат

вот что получается

Array
(
[1] => 0.16678
[2] => 0.16645
[3] => 0.16662
[4] => 0.16679
[5] => 0.16667
[6] => 0.16669
)

Array
(
[1] => 1.6666666666667E-6
[2] => 1.6666666666667E-6
[3] => 1.6666666666667E-6
[4] => 1.6666666666667E-6
[5] => 1.6666666666667E-6
[6] => 1.6666666666667E-6
)


А по теме . взяв во внимание твою функцию и материал Bustle я кажется понял как надо делать в общем комплексе.
Возможно всё
Пишу обо всем
13th вне форума Ответить с цитированием
Старый 16.01.2012, 00:51   #13
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

О! Попробуйте взять 2 игральные кости, а за случайную величину примите сумму выпавших граней. И посчитайте вероятности выпадения каждой суммы, результат будет интересный)))
Kostia вне форума Ответить с цитированием
Старый 16.01.2012, 00:59   #14
13th
Форумчанин
 
Аватар для 13th
 
Регистрация: 31.12.2008
Сообщений: 634
По умолчанию

Array
(
[2] => 0.08325
[3] => 0.08332
[4] => 0.08342
[5] => 0.08339
[6] => 0.08332
[7] => 0.08341
[8] => 0.0833
[9] => 0.08316
[10] => 0.08353
[11] => 0.08323
[12] => 0.0833
)

Array
(
[2] => 8.3333333333333E-7
[3] => 8.3333333333333E-7
[4] => 8.3333333333333E-7
[5] => 8.3333333333333E-7
[6] => 8.3333333333333E-7
[7] => 8.3333333333333E-7
[8] => 8.3333333333333E-7
[9] => 8.3333333333333E-7
[10] => 8.3333333333333E-7
[11] => 8.3333333333333E-7
[12] => 8.3333333333333E-7
)
Возможно всё
Пишу обо всем
13th вне форума Ответить с цитированием
Старый 16.01.2012, 10:52   #15
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Нет, не то. Ты должен дважды кинуть один и тот же кубик по сути. Как-то так:
PHP код:
$kub1rand(1,6);
$kub2rand(1,6);
$result[$kub1+$kub2]++;
...
foreach(
$result as $key => $value){
echo 
"P(".$key.") = ".($value/$total_tryes)."<br>";

А второй массив это фигня непонятная.
Kostia вне форума Ответить с цитированием
Старый 16.01.2012, 15:22   #16
13th
Форумчанин
 
Аватар для 13th
 
Регистрация: 31.12.2008
Сообщений: 634
По умолчанию

Тыкс, немного переделал скрипт
Код:
<?php
	
	$total_tryes = 100000;
	
	$result = array('2'=>0,'3'=>0,'4'=>0,'5'=>0,'6'=>0,'7'=>0,'8'=>0,'9'=>0,'10'=>0,'11'=>0,'12'=>0,);
	
	for($i=0;$i<$total_tryes;$i++){
	
		$rand_1 = rand(1,6);
		$rand_2 = rand(1,6);
		$rand_summ = $rand_1+$rand_2;
		switch($rand_summ){
			case 2 : $result[$rand_summ]++; break;
			case 3 : $result[$rand_summ]++; break;
			case 4 : $result[$rand_summ]++; break;
			case 5 : $result[$rand_summ]++; break;
			case 6 : $result[$rand_summ]++; break;
			case 7 : $result[$rand_summ]++; break;
			case 8 : $result[$rand_summ]++; break;
			case 9 : $result[$rand_summ]++; break;
			case 10 : $result[$rand_summ]++; break;
			case 11 : $result[$rand_summ]++; break;
			case 12 : $result[$rand_summ]++; break;
		}
		
	}
	
	foreach($result as $key=>$value){
		$result[$key] = $value/$total_tryes;
	}
	echo '<pre>';
		print_r($result);
	echo '</pre>';
	
	foreach($result as $key=>$value){
		$result[$key] = 1/11;
	}
	
	$result['4'] = 2/11;// 1 && 3 , 2 && 2
	$result['5'] = 2/11;// 2 && 3 , 1 && 4
	$result['6'] = 3/11;// 3 && 3 , 4 && 2, 5 && 1
	$result['7'] = 3/11;// 4 && 3 , 1 && 6, 5 && 2
	$result['8'] = 3/11;// 6 && 2 , 5 && 3 , 4 && 4 
	$result['9'] = 2/11;// 6 && 3 , 5 && 4 
	$result['9'] = 2/11;// 6 && 3 , 5 && 4 
	$result['10'] = 2/11;// 6 && 4 , 5 && 5
	echo '<pre>';
		print_r($result);
	echo '</pre>';
	
 ?>
Вот это вывод результатов тестов
Array
(
[2] => 0.02767
[3] => 0.05568
[4] => 0.08319
[5] => 0.11129
[6] => 0.13881
[7] => 0.16662
[8] => 0.13867
[9] => 0.11099
[10] => 0.08364
[11] => 0.05559
[12] => 0.02785
)
А это уже вероятность выдачи результатов
Array
(
[2] => 0.090909090909091
[3] => 0.090909090909091
[4] => 0.18181818181818
[5] => 0.18181818181818
[6] => 0.27272727272727
[7] => 0.27272727272727
[8] => 0.27272727272727
[9] => 0.18181818181818
[10] => 0.18181818181818
[11] => 0.090909090909091
[12] => 0.090909090909091
)
Возможно всё
Пишу обо всем
13th вне форума Ответить с цитированием
Старый 16.01.2012, 16:07   #17
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Цитата:
Array
(
[2] => 0.02767
[3] => 0.05568
[4] => 0.08319
[5] => 0.11129
[6] => 0.13881
[7] => 0.16662
[8] => 0.13867
[9] => 0.11099
[10] => 0.08364
[11] => 0.05559
[12] => 0.02785
)
это и есть экспериментальные вероятности полученные в ходе эксперимента. И при $total_tryes = бесконечности =), эти экспериментальные вероятности стремятся к реальным. Т.е. очевидно что семь очков выпадает гораздо чаще, чем остальные
Цитата:
Array
(
[2] => 0.090909090909091
[3] => 0.090909090909091
[4] => 0.18181818181818
[5] => 0.18181818181818
[6] => 0.27272727272727
[7] => 0.27272727272727
[8] => 0.27272727272727
[9] => 0.18181818181818
[10] => 0.18181818181818
[11] => 0.090909090909091
[12] => 0.090909090909091
)
А это нет! Суммах всех вероятностей должна быть равна 1, или для непрерывной случайной величины, интеграл в пределах +-бесконечность от функции распределения вероятностей равен 1.
Kostia вне форума Ответить с цитированием
Старый 16.01.2012, 16:36   #18
13th
Форумчанин
 
Аватар для 13th
 
Регистрация: 31.12.2008
Сообщений: 634
По умолчанию

а их не может быть равным одному . Это вероятность выдачи результата.
Вот тут я даже пометил какие позиции
Код:
$result['8'] = 3/11;// 6 && 2 , 5 && 3 , 4 && 4
то есть из 11 вероятных вариантов - это может выпасть 3 раза. Если конечно я правильно понял эту часть теории=)
Возможно всё
Пишу обо всем
13th вне форума Ответить с цитированием
Старый 16.01.2012, 16:59   #19
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Примерный алгоритм расчёта наносимого удара в моей игре в не автоматическом режиме:
- Получаем расстояние до противника.
- Проверяем нет ли на пути преград.
- Если есть преграда и это не игрок, то засчитываем промах.
- Если есть преграда и это другой игрок, то выполняем расчёт для него.
- Если преград нет и конечная цель противник, то случайным образом определяем точку удара (голова, руки, ...).
- Рассчитываем коэффициент точности в зависимости от расстояния и точки удара.
- Текущую точность игрока умножаем на полученный коэффициент и получаем точность попадания в противника на данном расстоянии.
- Получаем случайное число от 1 до 100 и проверяем попадает ли оно в процент точности попадания в противника на данном расстоянии.
- Если не попадает, то засчитываем промах.
- Если попадает, то переходим к расчёту урона.
- Из силы удара нападающего вычитаем сумму брони точки удара противника. Получаем урон.
- Получаем случайное число от 1 до 100 и проверяем входит ли оно в процент разности шанса критического удара нападающего и защиты от крит.удара противника.
- Если не входит, то критического удара нет.
- Если входит, то умножаем раннее рассчитанный урон на коэффициент критического удара для данной точки удара и наносим его противнику.

Для автоматического боя:
- Рассчитываем разность силы удара и брони для противника и игрока.
- Рассчитываем точность удара для противника и игрока без учёта расстояния.
- Рассчитываем шанс критического удара для противника и игрока.
- В цикле по очереди, начиная со стрелка, вычитаем из здоровья игроков критический и простой удар, если они не промахи.
- Когда очередь нельзя продолжить (один из игроков умер), то бой заканчиваем и объявляем победителя.
Виталий Желтяков вне форума Ответить с цитированием
Старый 16.01.2012, 17:53   #20
Кирил свердлов
 
Регистрация: 15.01.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Виталий Желтяков Посмотреть сообщение
Примерный алгоритм расчёта наносимого удара в моей игре в не автоматическом режиме:
- Получаем расстояние до противника.
- Проверяем нет ли на пути преград.
- Если есть преграда и это не игрок, то засчитываем промах.
- Если есть преграда и это другой игрок, то выполняем расчёт для него.
- Если преград нет и конечная цель противник, то случайным образом определяем точку удара (голова, руки, ...).
- Рассчитываем коэффициент точности в зависимости от расстояния и точки удара.
- Текущую точность игрока умножаем на полученный коэффициент и получаем точность попадания в противника на данном расстоянии.
- Получаем случайное число от 1 до 100 и проверяем попадает ли оно в процент точности попадания в противника на данном расстоянии.
- Если не попадает, то засчитываем промах.
- Если попадает, то переходим к расчёту урона.
- Из силы удара нападающего вычитаем сумму брони точки удара противника. Получаем урон.
- Получаем случайное число от 1 до 100 и проверяем входит ли оно в процент разности шанса критического удара нападающего и защиты от крит.удара противника.
- Если не входит, то критического удара нет.
- Если входит, то умножаем раннее рассчитанный урон на коэффициент критического удара для данной точки удара и наносим его противнику.

Для автоматического боя:
- Рассчитываем разность силы удара и брони для противника и игрока.
- Рассчитываем точность удара для противника и игрока без учёта расстояния.
- Рассчитываем шанс критического удара для противника и игрока.
- В цикле по очереди, начиная со стрелка, вычитаем из здоровья игроков критический и простой удар, если они не промахи.
- Когда очередь нельзя продолжить (один из игроков умер), то бой заканчиваем и объявляем победителя.
Скажите а как можно с вами лично связаться?? есть один очень важный вопрос?как писать в личку не знаю??
Кирил свердлов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
у юзера вопрос по браузерной игре ИгорьЦЦЦ Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 02.12.2011 15:12
подредактировать античит к игре игре Nhl 09 (античит написан на дельфи) Viper18 Фриланс 3 03.08.2011 17:37
Вероятность 60% Editor Общие вопросы Delphi 9 03.02.2010 19:04