我在Coding Horror上读过一篇关于各种shuffle算法的文章.我已经看到人们已经在某个地方对列表进行了洗牌:
var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());
Run Code Online (Sandbox Code Playgroud)
这是一个很好的shuffle算法吗?它是如何工作的?这样做是否可以接受?
这种通用库方法的最佳实现是什么?
public static <K, V> boolean containsEntry(
Map<K, V> map, K key, V value) {}
Run Code Online (Sandbox Code Playgroud)
与大多数编码难题一样,判断此谜题的标准依次为:
编辑:
好吧,既然关闭了,我不妨发布答案.我认为这可能是最佳的:
V valueForKey = map.get(key);
return (valueForKey == null)
? value == null && map.containsKey(key)
: valueForKey.equals(value);
Run Code Online (Sandbox Code Playgroud)
一个聪明的简单解决方案是:
return map.entrySet().contains(
new AbstractMap.SimpleImmutableEntry<K, V>(key, value));
Run Code Online (Sandbox Code Playgroud)
它确实分配了一个实例,但它为地图实现提供了更多机会来做一些最佳的事情.
我制造了原始战舰,现在我正在寻求将我的AI从随机猜测升级到统计上猜测位置.我无法在线查找算法,所以我的问题是这个应用程序已经存在哪种算法?我将如何实现一个?
船舶:5,4,3,3,2
场地:10X10
板:
OCEAN = "O"
FIRE = "X"
HIT = "*"
SIZE = 10
SEA = [] # Blank Board
for x in range(SIZE):
SEA.append([OCEAN] * SIZE)
Run Code Online (Sandbox Code Playgroud)
如果你想看到其余的代码,我在这里发布:(https://github.com/Dbz/Battleship/blob/master/BattleShip.py); 我不想用很多不相关的代码来混淆这个问题.
我正在用C#编写一个扑克框架,我不喜欢我现在的设计.我的目标是拥有一个游戏引擎,可以非常快速地以批处理模式相互播放多个AI代理,并且可以与多个人(可能通过Silverlight客户端)玩多个AI代理.我希望保持高效率但保持灵活性 - 例如,它应该能够玩有限德州扑克,无限注德州扑克,限制7张牌梭哈等游戏.
我目前的设计相当笨拙且不灵活:
HandInfo类包含有关如何设置手的所有信息.Play方法看起来像这样:
HandHistory Play(HandInfo info)
{
PotManager pots = new PotManager(info);
BetManager bets = new BetManager(info);
HandHistory history = CreateHistory(info);
bets.CollectBlinds();
if(!bets.GameOver)
{
DealHoleCards();
if(bets.PlayersThatCanStillBet > 1)
bets.CollectBets();
if(!bets.GameOver)
{
DealFlop();
... and on and on
}
}
return history;
}
Run Code Online (Sandbox Code Playgroud)
问题的出现是因为有很多小事要考虑收集百叶窗等等.Bot和Bet经理课程变成了一场噩梦,并且总是充满了虫子.此外,我的引擎设计仅支持一种游戏类型(德州扑克)而不是其他类型.
我的主要排名是效率第一,因为引擎主要用作数十亿手的AI模拟器.但是,我想有一种更优雅的方式可以做到这一点.