Войти
ПрограммированиеФорумОбщее

Распределить бонусы по ящикам

Страницы: 1 2 3 Следующая »
#0
19:02, 18 июня 2018

есть N ящиков, есть X бонусов.
ящик может содержать только 1 бонус либо может быть пустым.

как при создании карты равномерно распределить бонусы по ящикам? ну там 5 бонусов на 40 ящиков?


#1
19:45, 18 июня 2018

легко, если есть функция shuffle. Тусуется массив указателей на ящики, и в первые 5 ящиков этого массива добавляются по одному бонусу.

#2
22:00, 18 июня 2018

Можно проще, из набора 40 ящиков выбрать случайных 5. Есть разные способы как не попасть дважды в один и тот же ящик. Например чтобы не создавать дополнительные массивы, если уже имеется список существующих ящиков, нужно с шагом в 8 (40/5) ящиков выбрать 1 случайный из этих восьми. Иначе говоря брать по восемь ящиков и из них выбирать один через случайное число.

#3
1:24, 19 июня 2018

foxes
> Есть разные способы как не попасть дважды в один и тот же ящик.
Самый простой = выбираешь из списка случайный ящик и удаляешь его из списка, затем берёшь следующий случайный ящик.

#4
11:34, 19 июня 2018

Daniil Petrov
Удалить ящик из списка не всегда просто/быстро и подразумевает создание отдельного массива для удаления, вместо использования уже имеющегося типизированного списка со всеми ящиками. А взять "индекс + rnd(0,7)" и "индекс += 8" проще некуда - это весь алгоритм без подводных камней реализации работы с массивом, дополнительных условий и тп.

Но в твоем случае можно добавить условие - что выбранный ящик будет перемещаться в начало списка обмениваясь местами с первыми. Таким образом массив будет не тронут, первые N ящиков будут те куда нужно положить бонус, а остальные size-N те из которых нужно выбирать. Но опять же с условием, что можно нарушать последовательность в массиве ящиков.

#5
14:12, 19 июня 2018

foxes
Можно же отдельный массив создать, в котором хранить индексы в первоначальный либо слабые ссылки на ящики. Не думаю, что он будет рассовывать бонусы десятки раз каждый кадр.

#6
14:50, 19 июня 2018

Delfigamer
> Можно же отдельный массив создать
Ты даже сам это написал, но у меня ощущение что ты не читаешь даже то что сам пишешь. В моем случае массивы создавать не нужно и не нужно делать лишних операций. И дело тут не в скорости, а банальном объеме лишнего кода, который нужно поддерживать, следить за его работоспособностью. Пусть мелочь, но из таких мелочей скапливаются огромные библиотеки. Лишний массив это лишняя память - выделенная память, при большом количестве ящиков это большая память, выделение памяти всегда медленная задача. Все это лишние сложности - но при этом ты пишешь что это просто? Просто, потому что какое то API тебе предоставило эти функции, ты считаешь это проще двух сложений?

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

#7
16:43, 19 июня 2018

ardru
> легко, если есть функция shuffle. Тусуется массив указателей на ящики, и в
> первые 5 ящиков этого массива добавляются по одному бонусу.

точно

#8
20:36, 19 июня 2018

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

#9
22:59, 19 июня 2018

https://gamedev.ru/projects/forum/?id=154897&page=5#m62

#10
23:27, 19 июня 2018

}:+()___ [Smile]
> В твоем случае распределение не является равновероятным.
И по какой же причине это не равновероятно? Если для каждых 8 контейнеров вероятность выбора одной из них одинаковая. А вот для каждой итерации, когда я выкидываю один выбранный контейнер и опять выбираю из всех один, вероятность как раз увеличивается. Тогда первый контейнер берется с весом меньшей вероятности чем последний выбранный.

}:+()___ [Smile]
> некачественный фейк
Ну и где же тут фейк? Как раз таки мой пример является распространенным и часто используется, особенно в игровых автоматах, чтобы распределить 93% выигрышных денег, так чтобы в кассе всегда оставалось 7 процентов  входящей суммы.
Вон тебе чуть выше пример человек привел, визуально даже понятно что мины будут распределены не равномерно, даже вероятность того что все мины окажутся в одном углу имеет место быть, хоть это для игры наоборот может быть плюс. А в моем случае это такой же пример как с облаком астероидов:

+ Где из этого:
+ Получается это:

Без каких либо пустот или концентраций.
Ну или пример из области Стеганографии, так там как раз берут S пачек по N байт(бит) из M=N*S и добавляют 1 байт(бит) скрываемой информации в случайную позицию, пряча таким образом S байт(бит) информации - это вообще классика и самое что ни на есть равновероятное распределение - плотность изменяемых размещаемых элементов одинаковая.
Во до чего докатились. Вот так вот классические алгоритмы оказываются некачественным фейком - жесть!
#11
23:42, 19 июня 2018

foxes
> Удалить ящик из списка не всегда просто/быстро и подразумевает создание
> отдельного массива для удаления, вместо использования уже имеющегося
> типизированного списка со всеми ящиками.
Создай массив с номерами / именами / ссылками на ящики, в чём проблема! Создал оригинал списка, скопировал его, выбрал нужные ящики. В следующий раз снова скопировал и снова выбрал!

#12
23:48, 19 июня 2018

Daniil Petrov
Проблема в том что нужно что то копировать и создавать, мучая менеджер памяти и остальное для такого простого действия, а не сложить два раза числа. Ты еще на диск что нибудь запиши.

Это уже странная закономерность, когда люди опять приводят в пример алгоритм не понимая его сложности, а сложность в том, что проще не делать его совсем.
#13
1:39, 20 июня 2018

А вообще ТС походу нихрена не смыслит в программировании, раз задаёт такие тупые вопросы... я бы для начала реализовал хоть как-то, лишь бы работало, а со временем оптимизировал.
Мне плевать, что дипломированные программисты считают себя бАгинями, вызубрив кучу литературы, всё равно они не помогут решить задачу конкретным примером.
Поэтому, когда вопрос касается тупо работы какого-то менеджера, я реализую его сам, а потом по ходу дела шлифую и уже по мере возможности довожу до совершенства, хотя до совершенства можно доводить годами (работает и ладно, один хер всё не напишешь идеально!).

#14
1:43, 20 июня 2018

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

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.