我正在制作一个可以在游戏上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#中的蛮力卡震动方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)