在C#中的蛮力卡震动方法

在C#中的蛮力卡震动方法,第1张

概述在C#中的蛮力卡震动方法

我正在制作一个可以在游戏上testing一些卡片战术的机器人,这个机器人可以工作,但是我有一个问题。 我的摇卡方法不是很好。 我这样摇着牌:

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; }

问题是当我在卡片摇晃过程中没有停顿的时候,less数玩家会赢得很多游戏。 例如

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类对于像这样的蛮力是不够好的。 如何在没有这样的问题的情况下洗牌?

丢弃不需要的连接

在bash中每n个命令执行一次函数

使用Sublime运行Python时出错“系统找不到指定的文件”

closuresdocker容器内的MongoDB会导致100%的cpu

Python 3.5 setup.py egg_info失败,错误代码1

更新:我已经尝试过使用1个随机类,而且我也试图只晃动一次卡。

通过另一个程序给GUI应用程序提供input

用Nginx阻止所有的机器人

什么是更好的方法来同时具有实时循环和非实时function

discord.net不能在linux上工作

当你创建一个Random类的新实例时,它会播放当前时间,但是当前播放的时间只有16ms,这意味着如果你在同一个16毫秒的时间间隔内创建一个新的Random类(这是一个长时间的电脑)作为另一个例子,你会得到相同的随机数字序列。

一个好的解决办法就是确保你没有创建这么多新的Randoms 。 创建一次,然后将其传递到shuffle卡片方法中,或者创建一个只能在很多地方访问的静态随机(请记住它不是线程安全的)。

在一个侧面说明,为您的实际洗牌算法,这是相当不错的。 你可以做一个改善。 而不是将所选元素添加到最后并将其从中间移除,则可以将元素的末尾与中间的元素进行交换。 这是更有效率,因为从列表中删除不是一个有效的 *** 作。 另外,不是选择一个介于0和大小之间的随机数,而是选择一个介于0和(大小减去当前迭代次数)之间的数字。 有关该算法的更多详细信息,请参阅有关该主题的维基百科文章 。

拥有2个随机类并为另一个产生种子并不能提高随机性。

然后,不要在ShuffelCards中创建Random类。 在ShuffelDeck中创建它,并将其传递给ShuffelCards,或者使其成为该类的成员。 这应该有所帮助。

总结

以上是内存溢出为你收集整理的在C#中的蛮力卡震动方法全部内容,希望文章能够帮你解决在C#中的蛮力卡震动方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存