Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Новое яркое приключение в волшебной стране пасьянса Эмерлэнде!

Эмерланд пасьянс

Карточные, Головоломки, Пазлы

Играть

Топ прошлой недели

  • Oskanov Oskanov 9 постов
  • Animalrescueed Animalrescueed 46 постов
  • AlexKud AlexKud 33 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
seoirse
seoirse
5 лет назад

Вглядитесь!⁠⁠

Тёмно-оранжевый квадрат чуть правее и ниже от центра немного не вписывается, правда?

Ка-ааакой цвет! Настоящий восторг!

К сожалению, JPEG-сжатие ухудшило качество. Артефакты могут испортить впечатление.

Кстати, оригиналы сгенерированы одним моим славным Telegram-ботом.

Помимо таких картинок бот умеет генерировать QR-коды для введённого текста.
Но я их здесь, конечно, не показываю.

Один из моих интересов -- это создание и обработка изображений.

Показать полностью 4
[моё] Картинки Цвет Арт Генератор случайных чисел Telegram бот Длиннопост
64
snezhokp
5 лет назад

Как продвинуть приложение в топ Google Play бесплатно на примере моего приложения Генератор случайных чисел⁠⁠

Всем привет!
Не знаю с чего начать, поэтому начну с начала) Пост будет по-большей части о том, как я двигался вверх к топу. Я решил опытным путем проверить, возможно ли без вложений продвинуть приложение в топ категории. Пройдя определенный путь в этой сфере и набрав опыт, могу сказать определенно: Да. До того как я начал действовать, мне казалась эта идея чем-то невозможным. Вбивая в поиске разные приложения, смотрел в топ и ужасался. Казалось, в первые 10-20 позиций вообще невозможно затесаться. Практически по любым поисковым запросам на этих позициях в основном находятся приложения с миллионами скачиваний. Конечно же, в зависимости от категории, этот показатель варьируется, но в любой категории так или иначе это страшные цифры) Большинство приложений сделаны компаниями и нацелены на получение прибыли, в основном от рекламы. Соответственно, деньги на продвижение у них есть. Логичный вопрос вы можете задать. А как разработчику-одиночке конкурировать среди этих гигантов? Ответ: не знаю) У меня всего лишь есть свой опыт и реальный результат,  которым я могу поделиться с вами. Никто не сможет дать вам точный рецепт по пунктам как продвинуть приложение в топ. Конечно, нужно читать в интернете и искать информацию как это сделать, но не стоит тупо следовать по пунктам всему что написано. Настоящий исследователь изучит несколько источников, прежде чем сделает для себя какие-то выводы. Все зависит от вашего конкретного случая. Тщательное изучение материала избавит вас от глупых и ненужных ошибок в будущем. Пока вы будете интересоваться вопросом, найдете пару историй о том, как не стоит делать) Поэтому не нужно сразу с места в карьер.


Когда у меня появилась идея создать Генератор случайных чисел, я не стал в тот же день судорожно писать код. Прежде всего я изучил эту категорию в google play и посмотрел, с кем в будущем я буду конкурировать. По моему мнению стоит обращать внимание на первые 10-20 позиций, так как дальше идут однотипные приложения. Объясню, почему первым шагом было именно изучение категории. Дело в том, что когда у вас появляется идея, есть только общие мысли по ее реализации. Как правило, у вас в голове не появляется сразу дизайн, функции и всякие мелочи. Есть только общая идея. А когда вы изучаете категорию, подсознательно вы откладываете себе в "копилку" хорошие идеи как раз таки по дизайну, функциям, архитектуре и т.д(лучше записывать). У вас есть возможность посмотреть на все что есть и взять самое лучшее для себя. Постепенно у вас в голове вырисовывается более четкое понимание того, что должно быть на выходе. У вас есть отличная возможность не повторять ошибок конкурентов, хорошо изучив рынок, отзывы, аудиторию. Разработка приложения заняла несколько вечеров, включая тестирование, исправление багов... Скорее всего вы уже прочитали кучу статей о том, что важны хорошие иконки, скриншоты, текст описания на странице google play, SEO, ASO и другие неприличные слова) Если эта тема многим будет интересна, я расскажу технические подробности. Чему нужно уделить внимание, а что и так сойдет) Но вообще важно все. Самое главное вы должны уметь анализировать информацию, так как ее много и не всегда у вас сработает то, что, например, сработало у меня. Вообще алгоритм ранжирования приложений в гугле сложный и запутанный, как мозг женщины. Сложность состоит в том, что никто не знает точно, как он работает;) Есть только общие моменты, которые точно влияют на место в топе, такие как: количество скачиваний, отзывов, общая оценка. Есть даже количество скачиваний, которые нужно набирать в день, чтобы попасть в топ со старта. Много факторов влияет на это, но никто не знает точно в какой мере тот или иной фактор имеет больший вес по отношению к другим. Например, многие думают, что количество скачиваний - это один из определяющих факторов. Иногда это не так. Мое приложение на момент написания статьи находится на 3-м месте среди генераторов случайных чисел и имеет 1000+ скачиваний. А теперь внимание: на 4-м месте приложение, у которого 1 миллион+ скачиваний. Практически все приложения в топ 10 данной категории имеют от 10к до 1 миллиона+ скачиваний. Вы спросите, а как туда попало мое приложение с 1к+ скачиваниями? Ответа однозначного нет. Я просто собрал в кучу информацию, которую нашел в интернете по продвижению, проанализировал ее и применил с учетом моей аудитории и т.д. Если вам будет интересно более подробно, я сделаю отдельный пост об этом и расскажу что сработало, а что нет. Алгоритм ранжирования приложений в магазине - это как квантовая механика. Никто не знает как это работает, но все пользуются, так же как все пользуются гравитацией, не зная природы ее происхождения. Работает причина - следствие. Если сделать что-то, скорее всего будет так.


Есть какие-то общие советы, которых стоит придерживаться:

1. Сделать хорошее приложение без критических ошибок и багов.
2. Сделать хороший дизайн интерфейса, который будет прост и интуитивно понятен. Ваша задача сделать такое приложение, в котором разберется даже человек, у которого чехол-книжка на телефоне)
3. Хорошее понятное название
4. Оптимизировать описание и название для поисковых запросов. SEO, ASO, семантическое ядро и другие неприличные слова(считаю, что это очень важный пункт, так как именно это будет приносить вам органический трафик и, следовательно, двигать ваше приложение вверх)
5. Хорошие скриншоты и желательно видео.
6. Не выбирайте категории, там где большая конкуренция. Вам сложно будет конкурировать с такими гигантами как всякие тиктоки и инстаграмы.
7. Размер приложения.


На самом деле это примерный список и таких пунктов больше. И еще, если у вас в планах заработать на приложении, не пихайте сразу туда рекламу. Это очень раздражает пользователей. Подождите, пока приложение вырастет. Отсутствие рекламы очень вам поможет собрать положительные отзывы. Многие разработчики загубили очень хорошие приложения рекламой на старте.

Спасибо за внимание!

Показать полностью
[моё] Android Разработка Продвижение Генератор случайных чисел Приложение на Android Опыт Google Google Play Длиннопост Текст
16
BravoBetmen
5 лет назад

Рандомизатор c вероятностью на Pascal⁠⁠

Program random5;;

var

a:Integer;

begin

randomize;

a:= random(101);

if a <= 10 then  // 1

Writeln(1); 

if (a <= 20) and (a > 10) then // 2

Writeln(2);

if (a <= 30) and (a > 20) then // 3

Writeln(3);

if (a <= 40) and (a > 30) then // 4

Writeln(4);

if (a <= 50) and (a > 40) then // 5

Writeln(5);

if (a <= 60) and (a > 50) then // 6

Writeln(6);

if (a <= 70) and (a > 60) then // 7

Writeln(7);

if (a <= 80) and (a > 70) then // 8

Writeln(8);

if (a <= 90) and (a > 80) then // 9

Writeln(9);

if (a <= 100) and (a > 90) then // 10

Writeln(10);

end.



Как это работает?


Переменной "a" присваивается случайное число от 1 до 100

в условиях указан диапазон, чем он больше тем больше вероятность срабатывание оператора. но не так всё просто. Ниже я объясню как изменять вероятность

чтобы изменить вероятность, нужно изменить два числа

if a <= __ then // 1

Writeln(1);

if (a <= 20) and (a > __) then // 2

Как правильно рассчитать и вписать цифры?


Формула для 1

if (a <= z)

Z=X

Формула для  от 2 до 10

if (a <= z ) and (...)

if (a <= E) and (a > F)


пусть X задания вероятность

формулы:

E=X+Z

F=Z


например вероятность выпада "2" должна быть равна 25%


по формуле

X=25%

E=25+10=35

F=10


if a <= 10 then  // 1

Writeln(1);

if (a <= 35) and (a > 10) then // 2



Но сумма всех вероятностей (X ) должна равна 100%

например: вероятность выпада "4" должна равна 20% а выпада "5" 5%


будет выглядеть так:


if a <= 10 then // 1

Writeln(1);


if (a <= 20) and (a > 10) then // вероятность 10%

Writeln(2);

if (a <= 30) and (a > 20) then // вероятность 10%

Writeln(3);

if (a <= 50) and (a > 30) then // вероятность 20%

Writeln(4);

if (a <= 65) and (a > 50) then // вероятность 5%

Writeln(5);

if (a <= 75) and (a > 65) then // вероятность 10%

Writeln(6);

Можно добавлять больше вариантов, просто добавьте такой блок после последнего оператора

if (a <= E) and (a > F) then

Writeln(?);

За место "E" и "F" запишите цифры по формуле, которая была выше.

Показать полностью
[моё] Рандомайзер Генератор случайных чисел Вероятность Паскаль Длиннопост Текст
42
DELETED
6 лет назад

Говорящий пикабу⁠⁠

Когда посты свернуты, в глаза стали попадаться интересные сочетания: Иногда заголовки становятся в таком порядке, что кажется, буд-то их специально так ставят по смыслу. Сегодня просто не смог пройти мимо:


-Наши кошелек а там...

-Деньги на телефон


Настоящий полковник...

Похмелье


-Ветрянка у взрослых. Как пережить и не сойти с ума? - Педикюр


- Контакт

- Несчастный случай.


Белорусы на волне популярности

За хлебушком.


Как я не съездил в Израиль.

Статья 124 УК РФ


Южная Корея отказалась присоединяться к санкциям США против Huawei

На сайте по продаже велосипедов


Фехтование: Один против нескольких

Ответочка.


Птенцы из магазина. Мой опыт.

К вопросу о воспитании.

Приемный утенок


пруфы заскринил.

Показать полностью 3
[моё] Посты на Пикабу Пикабу Рандом Генератор случайных чисел Ъуъ Длиннопост
5
9
basvas6
6 лет назад
Программирование на PHP

Насколько ты предсказуем?⁠⁠

Хочу поделится историей создания одного сайтика. Так уж совпало, что не так давно я решил изучить один PHP фреймворк (YII2), но тренироваться на стандартных примерах типа интернет магазина было скучно, поэтому я решил придумать что-то оригинальное. И тут я наткнулся на это видео

И тут меня накрыло. Если вкратце, речь идет о том, что если бы человеку предложили игру, в котором он мог сделать выбор, взять одну или две коробки. В первой коробке всегда 1000$, во второй либо 0, либо миллион. Также есть некая сущность которая может предсказать выбор человека, и если эта сущность считает, что человек возьмет обе коробки, то во вторую коробку она не положит ничего. И если, вероятность верно предсказать действия человека (взять одну или две коробки), больше 50%, то получается парадокс: теория игр говорит что выгоднее всего брать обе коробки, а статистика что только одну.


Это подводит нас к размышлениям о свободе воли человека и о возможности предсказать его действия. Но самое главное, в условиях игры сказано, что ни человек, ни компьютерная программа, которая будет делать выбор, не имеют права подбрасывать монетку/использовать генератор случайных чисел. Это показалось мне интересным, я задумался, может ли мозг генерировать абсолютно случайные числа, а лучше последовательности чисел. Для начала я сравнил наше сознание с тем, что мне как программисту ближе, с нейронными сетями. Поискав я наткнулся на эту серию статей на Хабре: Нейросети для чайников(https://habr.com/ru/post/143129/).


Результаты были неутешительны, большинство нейросетей детерминированы, то есть зная состояние сети в данный момент можно предсказать ее решение. Оставалась надежда только на человеческий мозг. Я конечно мог проверить только свою способность к генерации случайных чисел, но один человек это не показатель, и тут мне пришла в голову идея написать сайт, на котором любой желающий может проверить то, насколько случайны последовательности чисел, выдаваемые его мозгом.


Дизайн у сайта получился простенький (читай "И так сойдет"):

Теперь можно проверить, насколько случайна та или иная последовательность, по нескольким показателям. И получить средний результат в процентах.

Для того кому интересно как оцениваются величины, а также как устроен сам сайт, я оставлю ссылку на GitHub.


Когда сайт был закончен, я понял что неплохо бы его где-то разместить. К счастью, сейчас можно найти абсолютно бесплатные хостинги и домены, возможности которых на данном этапе меня вполне устроили.


Итак, кому интересно могут зайти по следующим ссылкам:

GitHub: https://github.com/BasValery/RandomSeed

Сам сайт: http://randomseed.ml/

Показать полностью 2
[моё] Длиннопост Сайт Программирование Генератор случайных чисел Видео
2
Papamio
Papamio
6 лет назад

Генератор случайных чисел⁠⁠

На всяких пабликах разыгрывают всякую всячину и для определения победителя,  пользуются в основном генератором случайных чисел.  Вот бы взглянуть на этот генератор!!!

[моё] Генератор Генератор случайных чисел Паблик Текст
11
793
Kaborator
Kaborator
6 лет назад
Лига Разработчиков Видеоигр

Заблуждения игроков при оценке рисков. Манипуляции с генератором случайных чисел при разработке игры⁠⁠

Человеческий мозг по своей природе очень плохо умеет оценивать вероятность срабатывания случайных событий, на основании выданной числовой оценки. И довольно хорошо на основании качественных оценок. А все потому, что человек мысленно делает конвертацию числовых вероятностей в качественные оценки, и делает это очень субъективно:

— 80% попадания выстрела в игре — ну это почти гарантированное попадание;

— 80% того, что ваш товарищ хоть когда-нибудь отдаст долг — не-не-не, так не пойдёт, это слишком большой риск;

— 5% получения критического урона он NPC врага — маловероятно, риск можно игнорировать;

— 1% риск падения сосульки, если пройти под крышей с капающими метровыми сосульками — ещё чего, лучше обойти с другой стороны тротуара;

— 51% вероятность выигрыша в мини-игре в большой РПГ — можно рассчитывать на то, что после 20 ставок я чуть-чуть выиграю или, как минимум, останусь при своих… через 20 ставок… как такое могло случиться, что я проиграл половину всего своего золота? Тут явно сломан генератор случайных чисел!

В статье будут рассмотрены следующие вопросы:

— ошибочные допущения в оценке вероятностей;

— конкретные примеры заблуждений игроков и фактические вероятности «редких» событий;

— генератор случайных чисел (вообще-то псевдослучайных);

— ранние простые генераторы псевдослучайных чисел на примере Final Fantasy I;

— подходы к реализации случайных событий с воспроизводимостью и без;

— примеры удачно внедренных разных подходов и манипуляции в Fire Emblem.

I. Ошибочные допущения в оценке вероятностей


В процессе эволюции человеческий мозг учился очень хорошо оперировать качественными оценками событий и образами своего опыта. А числа и абстрактную числовую оценку вероятности «случайных» событий человек придумал сравнительно недавно [1]. Тем не менее эти числа человек в своих оценках всё равно преобразует в качественные представления: чуть-чуть, мало, много, опасно, безопасно, достаточно. Оценки эти всегда зависят от контекста и субъективного отношения к этому контексту. Именно это и является основной причиной ошибочных числовых допущений.


В качестве примера будет рассмотрена пошаговая игра Disciples 2 [2]. В данной части статьи не будет рассматриваться качество генерации случайных чисел конкретно в этой игре. Про их генерацию будет достаточно данных во второй части статьи.

Disciples 2 — типичный промах [2]


Стандартная атака ближнего боя имеет шанс попадания 80%. Обычно этот шанс воспринимается игроком как "почти всегда", а риск промаха — "изредка / время от времени". Вероятность промахнуться 2 раза подряд при двух атаках равна 4%. Игрок этот риск воспринимает как "почти никогда / такое будет случаться крайне редко". И когда подобное случается, игроки возмущаются на «кривой рандом»: [3]; [4].


Но в ситуациях с двумя промахами подряд и оценкой риска в 4% беглая оценка игроком имеет несколько ошибочных допущений:

1. 4% это вовсе не "почти никогда". Это событие, которое будет случаться в каждом 25-ом независимом эксперименте (в среднем).

2. Оценка проводится на неправильном отрезке времени. Минимальным отрезком замера атак по 80% следует брать не 2 атаки, а все атаки одного класса (~80%) за время «настороженной» памяти игрока. Чаще всего за это время можно взять долгую игровую сессию или вообще всю игру, тут всё зависит от типа игры, памяти игрока и предпочтений считающего.

Так как настоящей статистики использования этой игры у меня нет, я буду исходить из предположения, что долгая игровая сессия в Disciples 2 длится 3 часа и за это время совершается около 250 атак с меткостью ~80%. Стоит заметить, что промахи врагов следует игнорировать, т.к. их промахи игрока не злят, и он редко их запоминает.

Так вот, оценивать следует ситуацию: «За все 250 атак ни разу не произойдет 2 промахов подряд».

Для подсчета вероятности истинности данного события была использована рекуррентная формула: P1(n)=0.8*P1(n-1)+0.16*P1(n-2). В выведении этой формулы я воспользовался помощью сообщества, цитата вычислений, подробности и результат приведены ниже.

Можно попробовать применить индукцию. Введём несколько обозначений. Вероятность сохранить лапу после n-й вылазки обозначим P(n). Представим эту вероятность в виде суммы двух вероятностей
P(n) = P1(n)+P2(n), где P1(n) это вероятность, при которой крайняя n-ая вылазка оказалась удачной, а P2(n) — неудачной.
Может показаться что P1 и P2 пропорциональны 0.8 и 0.2, но это не так. Из-за того что мы рассматриваем не любые возможные исходы, а только те, которые сохранили лапу еноту.
Попробуем теперь вывести рекуррентную формулу
P1(n)=0.8*(P1(n-1)+P2(n-1))
P2(n)=0.2*P1(n-1)
Подставим P2 в формулу для P1 получим
P1(n)=0.8*P1(n-1)+0.16*P1(n-2)
Дальше Решение рекуррентных соотношений [5]
Цитата с решением задачи от пользователя Serbbit [6]

Для решения задачи вместо того, чтобы разбираться с методами решения рекуррентных соотношений, был написан маленький javascript код для консоли браузера и вычислен результат.

var P1 = [];
P1[0] = 1;
P1[1] = 1;
for (var n=2; n<=250; n++) {
P1[n] = 0.8 * P1[n-1] + 0.16 * P1[n-2];
console.log(n + ') ' + P1[n]);
}
// ответ: 250) 0.0001666846271670716

В итоге ответ: 0.0001666846271670716

Или 0.0167%


Этот ответ совпадает с ответом другого автора Kojiec9: 0.000166684627177505 [6], который использовал свой выработанный метод с пятиричной системой счисления и вычислил результат по своей формуле в Паскале. Незначительные различия в ответах, объясняются, судя по всему, округлениями float чисел.


Так вот, за 3 часа игры в Disciples 2 игрок имеет шанс избежать двойного промаха при 80% меткости всего в 0.0167%. Вот это уже действительно очень маловероятно. (а вероятность хотя бы одного двойного промаха, соответственно равна 99.9833%).

Рост вероятности хотя бы одного двойного промаха с ростом числа экспериментов


Про несовершенство и искажения человеческой памяти, кстати, вообще целые исследования и книги существуют: «Иллюзии мозга. Когнитивные искажения из-за переизбытка информации» [7]; «Не верьте своему мозгу» [8], если вас эта тема заинтересовала, рекомендую начать ознакомление с этих статей.

3. Третье неверное допущение — это ожидание зависимости во взаимно независимых экспериментах.

То есть после первого промаха игрок думает:

«Так, персонаж промахнулся с меткостью 80%. Теперь-то он точно попадёт, ведь риск двойного промаха равен всего 4%».


А вот и нет. После первого промаха риск очередного промаха будет так же равен 20%. Ведь прошлая атака уже случилась и никак не влияет на будущий выстрел. Более того, если до первой атаки вероятность двойного промаха была равна 4%, то после первого промаха вероятность двойного промаха становится уже 20%, то есть относительно ожиданий игрока риск только возрастает.

Эта особенность человеческого мозга особенно привлекательна для манипуляций со стороны казино (и им подобных) в азартных играх (подробнее об устройстве игровых автоматов от производителя [9]).

Ещё интересные примеры заблуждений человеческого мозга можно почерпнуть в статьях про баланс Яна Шрайбера «Level 5: Probability and Randomness Gone Horribly Wrong» (Уровень 5. Вероятность и случайность пошли вразнос) [10].


II. Генератор случайных чисел


Используемый в играх термин «Генератор случайных чисел» (RNG / random number generator) почти всегда в действительности означает «Генератор псевдослучайных чисел» [11]. Главной особенностью этого генератора является его воспроизводимость. Воспроизводимость означает то, что, зная изначальный порождающий элемент (или зерно / seed) всегда будет получена одна и та же последовательность случайных (псевдослучайных) чисел. В некоторых играх этот эффект проявляется в том, что после перезагрузки игры последовательность попаданий и промахов остается неизменной. А в других играх не остается той же самой.

А все дело в том, как применяется этот генератор псевдослучайных чисел и какие дизайнерские цели преследует разработчик.


Чтобы лучше понять принцип работы генератора псевдослучайных чисел, можно рассмотреть способ его реализации в первых классических играх, когда ресурсы компьютеров (и консолей) были особенно сильно ограниченны. (Углубленное описание примеров и их особенностей читайте в статье «How classic games make smart use of random number generation» [12].)

How classic games make smart use of random number generation [12]


В Final Fantasy I использовались несколько таблиц с заранее заданными фиксированными числами с 256 значениями в каждой таблице:

— для вычисления случайных сражений с каждым шагом в игровой карте алгоритм перемещался по таблице, изменяя индекс на 1 за раз, таким образом постепенно прокручивая все возможные значения — от этого зависел как сам факт столкновения, так и возможная группа противников;

— для вычисления результатов сражения тоже использовалась подобная таблица из 256 фиксированных значений, но перемещение по ней происходило не только с каждым очередным использованием псевдослучайного числа, но и каждые 2 кадра. То есть каждые 2 кадра алгоритм вхолостую прокручивал таблицу с числами, тем самым уменьшая риск прогнозируемых одинаковых последовательностей. Источником энтропии тут была неопределенность, сколько времени игрок будет думать до выбора очередной команды.


В качестве зерна (порождающего элемента) в Final Fantasy I используется порядковый номер (индекс) фиксированного значения в таблице. То есть, зная место, откуда будут дальше выбираться случайные числа, можно точно предсказать какое случайное число будет выдано после 1000 проверок. В более сложных алгоритмах генерации псевдослучайных чисел зерно используется не так просто, но основной принцип и эффект остаются.


Сейчас для генерации псевдослучайных чисел в основном используются стандартные библиотеки используемых языков программирования. В качестве источника энтропии чаще всего используется текущее системное время. Для нужд игровой индустрии характеристик стандартных библиотек обычно хватает. Недостатки генератора и источника энтропии используются игроками очень редко из-за сложности их вычисления и манипулирования. Обычно это остаётся уделом спидранеров-программистов (например, взламывающего логику Pokemon Colosseum [13]), а значит разработчикам такие тонкости чаще всего разумнее игнорировать.

III. Разные подходы к использованию генератора


1. Зерно фиксируется на момент старта миссии или игровой кампании.

Последствия для игрока: перезагрузка игры не изменит факт промаха персонажем (назовем его чокнутым Фиделем), даже если вероятность его попадания равна 99%. Однако, перед попыткой попасть игрок может совершить какое-либо другое действие, которое использует случайное число, например, походит другим персонажем — лысым Миком. В результате этого несчастливое случайное число будет использовано лысым Миком, а на чокнутого Фиделя будет использовано следующее случайное число в последовательности — тогда он, возможно, попадёт.

Как игрок может злоупотребить этим: если бросок с меткостью 50% приводит к промаху, то можно перезагрузиться и попробовать атаку с меткостью чуть-чуть повыше (55%), пока не попадёт. После попадания сохраниться и повторить это с другими бросками.

Положительные последствия для разработчика:

1) Игру можно воспроизвести пошагово, если хранить только начальное состояние, зерно и последовательность действий. Благодаря этому можно показывать повторы и даже очень компактно хранить файлы сохранений. Способ позволяет очень сильно сэкономить занимаемое место на диске/памяти.

2) Защита внутренних азартных игр, чтобы сохранение/загрузка не позволяла игроку обанкротить всех встречающихся NPC соперников.

Пример:

Игра roguelike Brogue [14] использует этот способ, начиная с генерации игрового мира и заканчивая просчетом всех действий игрока. В результате этого в файле сохранения хранится только стартовое зерно и последовательность игровых команд. Дополнительный бонус этого эффекта в том, что игру можно начать с выбранным номером зерна, предварительно выбрав наиболее интересный мир в таблицах сгенерированных миров Brogue [15].

Brogue roguelike — официальный сайт [14]

2. Зерно не фиксируется или обновляется каждый раз после перезагрузки.

Последствия для игрока: любая перезагрузка изменяет все расчеты в шансах попаданий.

Как игрок может злоупотребить этим: очень просто — несколько перезагрузок и самый маловероятный сценарий попадания может стать реальностью.

Положительные последствия для разработчика:

1) Игроки воспринимают такую игру как более честную с настоящей случайностью, просто из-за отсутствия знаний внутренних механик.

2) Игроки получают неофициальный лёгкий режим, который при желании позволяет сильно облегчить сложные участки.

3) Разработчик может прикрыть халяву разными методами: одним автосохранением на игру (то есть перезаписывание сохранений и перманентная смерть) или запретом сохранения во время миссии (в разных вариациях). А наиболее чувствительные участки (азартные мини игры) можно просчитывать на основании отдельного неизменного зерна, хотя технически это значительно труднее.

Пример:

Игра The Battle for Wesnoth [16] использует нефиксированное зерно с принципиально честной случайностью. Честность заключается в том, что иногда возможны совершенно маловероятные последовательности неудач, и движок игры их не корректирует. Результатом этого являются периодические гневные посты раздраженных игроков в адрес разработчиков игры.

Reddit — супер ловкая русалка в Wesnoth [17]


Также перед атакой игра предоставляет подробные расчеты вероятностей каждого из возможных исходов атаки: наносимый урон, получаемый урон и вероятность гибели одного из противников. Вывод этих вероятностей только накаляет гнев «неудачно походивших», т.к. уверившись в хороших шансах при атаке, сложно смириться с результатом, у которого была оценка 1 к 1000.

3. Зерно не фиксируется, а сами результаты подвергаются дополнительным манипуляциям.

Под манипуляциями я имею в виду такие динамические корректировки, в результате которых увеличивается ощущение правильной (справедливой) случайности за счёт потери настоящей псевдослучайности в получаемых числах.

Последствия для игрока: аналогично играм с нефиксированным зерном — перезагрузка позволяет пересчитать результаты.

Как игрок может злоупотребить этим: с помощью сейвскаминга можно подобрать выгодную комбинацию атак, но во многом зависит от способа реализации и наличия защитных механизмов со стороны разработчика.

Положительные последствия для разработчика: разработчик может контролировать редкость нежелательных исходов, делать видимость "честного рандома", увеличивать и уменьшать сложность игры. Если разработчик при подсчете шанса на попадания хранит и раздельно учитывает срабатывания для каждой команды, то он может сильно уменьшить злоупотребления от сейвскаминга, гарантируя, что свою среднеарифметическую порцию урона игрок всё равно получит.

Примеры:

Разработчик Carsten Germer использует функцию контролируемой случайности для редких и не только событий [18]. Например, чтобы гарантировать периодическое выпадение особо редкого бонуса с шансом 1 к 10000, он после каждого «промаха» увеличивает шансы по порядку: 1 к 9900; 1 к 9800; 1 к 9700… и так до фиксации события. А чтобы гарантировать отсутствие частых редкостей, он ввел дополнительную переменную, блокирующую срабатывание на 100% в течение 10 следующих проверок после прошлого срабатывания.


В своем рогалике Grue the Monster [19] я также использовал манипуляции со случайностями. Обычно при преследовании жертв персонаж игрока должен прятаться за их спинами, поджидая, когда они сделают шаг назад и попадут к нему в лапы. Обычно такой шанс равен 1/6 в открытом пространстве (1/2 в коридорах и 1/1 в тупиках), но чтобы уменьшить раздражающий эффект особенно невезучих ситуаций, перед каждой проверкой направления хода жертвы в 15% случаев она гарантированно шла в направлении к Гру.

Grue the Monster - рогалик на Андроиде [19]

Самый интересный случай: в игре Fire Emblem: The Binding Blade [20] была реализована скрытая механика определения попадания при атаках [21]. Традиционно для серии вероятность попадания показывается игрой в процентах от 0 до 100%. В более ранних играх серии факт попадания определялся одним случайным числом от 1 до 100: если выпадающее число (например, 61) меньше или равно вероятности попадания (например, 75), то засчитывается удар, если больше, то промах.

Fire Emblem: The Binding Blade [20]


В данной части была введена щадящая система: вместо одного случайного числа бралось среднее двух случайных чисел, и это среднее сравнивалось со значением меткости. То есть случайное число в большей степени стремится к значению 50. Это приводит к искажению линейного эффекта случайности попадания: бойцы с меткостью больше 50% попадают чаще, чем в 50% случаев, а с меткостью меньше 50% значительно реже. А так как в игре подавляющее большинство персонажей игрока имеют большую меткость, а большинство врагов меньшую, то игрок получает очень серьёзное скрытое преимущество [21]. Ниже показан график этого эффекта, где синей линий показана частота попаданий в старой системе, а красной частота попаданий в новой в зависимости процента меткости атакующего. Например, при показываемой вероятности попадания в 90%, фактическая вероятность будет равна 98,1%, при 80% — 92,2%, а при 10% — всего 1,9%!

Искажение шанса попадания. По оси Y фактическая вероятность, по оси X — показываемая игроку


Это, безусловно, не единственные примеры манипуляций со случайными числами и балансом, но найти их очень сложно. Поэтому помощь сообщества здесь будет особенно ценной.


Хочу отметить, что я не отношу к манипулируемой случайности процедурную генерацию, как таковую. Пример: рогалик сгенерировал случайный уровень со случайным набором врагов, ловушек, стен и тупиков. Если при этом был создан уровень, который невозможно пройти, то пример кривой разработки, недостаточно продуманного проектирования или слабого тестирования. Разработчик обязан процедурно проверять хотя бы базовые проблемы случайной генерации:

— проход к выходу всегда должен быть хотя бы в единственном числе. Тут помогают любые алгоритмы поиска пути;

— серия ловушек должна иметь возможность обхода, и если их создаётся слишком много в одном месте, то алгоритм должен вычислить их плотность и удалить лишние;

— слишком сильные враги должны предоставлять хотя бы один из доступных способов их «прохождения»: грубой силой; свитками и зельями; особыми артефактами или возможностью просто от них убежать;

Такое вмешательство в случайные результаты не являются манипуляцией, а являются просто правилом минимально грамотного подхода к разработке. Используются эти проверки во всех способах генерации псевдослучайных чисел.

4. Вообще убрать элемент случайности из механики игры.


То есть результаты каждой атаки всегда имеют 100% вероятность попадания и фиксированный урон, а также постоянные правила срабатывания дополнительных эффектов. Вместо этого можно использовать случайные вычисления для косметических целей: периодические «позёвывания» ожидающих своего хода персонажей; отлетание чисел нанесенного урона; эффекты столкновений и взрывов. Тут нет никакой разницы, как генерировать случайные числа и насколько равномерно распределение.

Хотя и в этом случае можно использовать первые три способа в расчетах искусственного интеллекта, когда вражеские персонажи могут в какой-либо степени случайно выбирать цели для атаки или ходить командой в случайном порядке. Но это уже будет менее заметно для игрока и раздражающих ситуаций будет значительно меньше.

Последствия для игрока: перезагрузка либо никак не влияет на результаты, либо влияет незначительно.

Как игрок может злоупотребить этим: игрок может вычислить или найти в сети стабильную доминирующую стратегию и использовать только её. Стоит отметить, что для определённых групп игроков это является основным интересом в игре.

Положительные последствия для разработчика: разработчику значительно легче сбалансировать такую игру. Как минус — при этом возникающие доминирующие стратегии становятся стабильными, а значит, даже невезение игрока не сможет привести его к поражению, а приводит к исчезновению всяких неожиданностей, скуке и удалению игры. Игроки высокого класса почти всегда будут выигрывать у игроков классом пониже, для различных типов игр это может быть как преимуществом, так и недостатком.

Пример:

Любые шахматы с классическими правилами.

Также сюда подходят логические roguelike. Например, очень хорошо данный метод реализован в Desktop Dungeons Alpha [22].

Desktop Dungeons Alpha [22]


Здесь результаты последовательности атак всегда одинаковы и заранее просчитываемы. Однако за счет случайной (процедурной) генерации игровых подземелий и наличия тумана войны, игра приобретает свою уникальную реиграбельность лучших рогаликов.


Заключение


Таким образом, в статье рассмотрены две подтемы случайности в играх:

— Ошибочные допущения в оценке вероятностей. Описаны интуитивные допущения, которые делает игрок, и которые часто оказываются неправильными из-за их субъективности. Основной вывод: настоящая случайность не только не гарантирует того, что пользователи останутся довольны, но даже может привести к обратному эффекту.

— Генерация псевдослучайных чисел. Описаны разные подходы к использованию случайности. Удачные примеры реализации показывают, что независимо от выбранного подхода игра может получится интересной, неожиданной и с хорошей степенью реиграбельности.

Осознанное последовательное использование выбранного подхода позволяет разработчикам подчеркнуть их положительные стороны и максимально нивелировать их отрицательные.

Источники литературы

1. История математики, теория вероятностей — Википедия.

2. Disciples 2 — GOG Gold.

3. Disciples 2 — комментарий про кривой рандом №1.

4. Disciples 2 — комментарий про кривой рандом №2.

5. Решение рекуррентных соотношений.

6. Цитата с решением задачи от пользователя Serbbit.

7. Иллюзии мозга. Когнитивные искажения из-за переизбытка информации.

8. Не верьте своему мозгу.

9. Игровой аппарат изнутри и снаружи. Обзор от производителя.

10. Level 5: Probability and Randomness Gone Horribly Wrong.

11. Генератор псевдослучайных чисел — Википедия.

12. How classic games make smart use of random number generation.

13. Controlling luck in video games — Pokemon Colosseum and XD.

14. Brogue roguelike — официальный сайт.

15. The Brogue Seed Scummer.

16. The Battle for Wesnoth.

17. Супер ловкая русалка в Wesnoth.

18. «Not So Random Randomness» in Game Design and Programming.

19. Grue the Monster roguelike на Андроиде.

20. Fire Emblem: The Binding Blade.

21. Random Number Generator in Fire Emblem.

22. Desktop Dungeons Alpha roguelike.

Показать полностью 10
[моё] Final Fantasy Fire Emblem Gamedev Генератор случайных чисел Вероятность Риск Заблуждение Манипуляция Гифка Длиннопост
194
Kanedias
Kanedias
7 лет назад

А для чего вы используете генератор случайных чисел?⁠⁠

Наткнулся в интернете на сайт с генератором случайных чисел. Оказывается, и для такого он может пригодиться.

А для чего вы используете генератор случайных чисел?
Генератор случайных чисел Комментарии
2
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии