gpt4 book ai didi

c# - C#中暴力刷卡的方法

转载 作者:可可西里 更新时间:2023-11-01 13:28:10 26 4
gpt4 key购买 nike

我正在制作一个可以在游戏中测试一些纸牌战术的机器人,该机器人可以正常工作,但我遇到了一个问题。我的摇卡方法不是很好。我这样摇牌:

        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 类的新实例时,它会以当前时间作为种子,但作为种子的当前时间只有 16 毫秒的精度,这意味着如果您创建一个新的 Random 类在与另一个实例相同的 16 毫秒间隔内(这对于计算机来说是一个 long 时间),您将获得相同的随机数序列。

一个好的解决方案是确保您不会创建那么多新的 Random。创建一个,一次,然后将其传递给洗牌方法,或者创建一个只能在很多地方访问的静态随机数(请记住,它不是线程安全的)。

附带说明一下,对于您的实际洗牌算法来说,它非常好。不过,您可以进行一项改进。与其将所选元素添加到末尾并从中间删除它,不如将末尾的元素与中间的元素交换。这是更有效的,因为从 List 的中间删除不是一个有效的操作。此外,不是选择 0 和大小之间的随机数,而是选择 0 和(大小减去当前迭代的次数)之间的数字。查看wikipedia article on the subject有关该算法的更多详细信息。

关于c# - C#中暴力刷卡的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11656305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com