我正在寻找一种算法来随机化一组具有 length 的项目n
,其中每个项目可能有多个(1 到m
)。另一个限制是同一项目可能不会出现k
在前一个项目中。
您可能会假设n
它远低于 100,并且总是有一个解决方案,即m
很小k
。如果有帮助,您还可以将输入更改为 <item, frequency> 对列表。
为了提供一些背景信息,假设我在游戏中生成任务并且有一组目标可供选择。有些目标可能会出现多次(例如“杀死老板”),但不应彼此靠近,因此简单地洗牌“袋子”是不好的。
我可以对列表进行洗牌,然后在跟踪项目间隔的同时对其进行迭代,如果测试失败,则从新的洗牌开始,但我正在寻找一种更优雅的解决方案,它也应该是紧凑、实用且易于实现的,例如C、C++ 或 JavaScript。换句话说,它不应该依赖于我可能不理解或很难实现的特殊语言特性或标准库函数。但是,您可以假设最常见的列表操作(例如排序和混洗)可用。