【发布时间】:2012-07-24 06:32:43
【问题描述】:
我正在制作一个可以在游戏中测试一些卡牌战术的机器人,该机器人可以工作,但我有一个问题。我的抽卡方法不是很好。 我这样摇牌:
public void ShuffelDeck()
{
for (int i = 0; i < 5; i++)
Cards = ShuffelCards(Cards);
}
private ArrayList ShuffelCards(ArrayList Cards)
{
ArrayList ShuffedCards = new ArrayList();
Random SeedCreator = new Random();
Random RandomNumberCreator = new Random(SeedCreator.Next());
while (Cards.Count != 0)
{
int RandomNumber = RandomNumberCreator.Next(0, Cards.Count);
ShuffedCards.Insert(ShuffedCards.Count, Cards[RandomNumber]);
Cards.RemoveAt(RandomNumber);
}
return ShuffedCards;
}
问题是当我在摇牌过程之间没有停顿计算时,少数玩家会赢得很多游戏。例如
Player 1: 8 games
Player 2: 2 games
Player 3: 0 games
Player 4: 0 games
但是当我在摇牌过程之前添加一个对话框时,胜利将传播给玩家:
Player 1: 3 games
Player 2: 2 games
Player 3: 1 game
Player 4: 4 games
我猜 Random 类对于像这样的蛮力来说还不够好。我怎样才能洗牌而不出现这样的问题?
更新: 我已经尝试过使用 1 个 Random 类,并且我也尝试过只摇一次牌。
【问题讨论】:
-
有什么理由你还在使用
ArrayList而不是List<T>? -
每次有人用
ArrayList编写新代码时,都会有一只小狗死去。 -
@pstrjds:嗯,它可能是一只小狗。它可能是一只小猫。它可能只是一个字符串。没有办法知道。当然,如果你有
List<Puppy>,那就不一样了…… -
@JonSkeet A List
绝对是个坏主意。没有比拳击更能让猫开心的方法了! -
@hometoast 该算法已经等同于 Fisher-Yates,除了它不是原地改组