Collections.shuffle适合扑克算法吗?

Kov*_*ovu 4 java poker

java中有一个扑克系统,在发Collections.shuffle()牌之前使用所有可用的牌.

所以收集了52种卡片2-9,J,Q,K,A 4种类型.

在那之后我们Collections.shuffle().

问题是,似乎(直到现在我们没有大的统计数据,我们可能只看到很多统计推断),算法非常不清楚.

那么,Collections.shuffle()扑克算法还可以吗?


评论的答案:"不清楚",我的意思是它在某个时候非常非常神秘.很多用户抱怨"这与现场/其他扑克室不一样".我用这个系统玩了很多,并且必须说,我同意,我看到2000年以下的3个皇家闪光灯在这个系统中起了作用,并且在其他扑克室中有超过100,000个玩牌,我看到2直到今天.

Han*_*Gay 9

如果这是一个严肃的扑克应用程序,钱可以转手,简短的答案是否定的.对于这样的事情,你应该真正使用真正随机性的硬件源.

稍微长一点的答案是:如果您无法获得真正随机性的硬件,那么如果您提供的话可能就足够了.这个解决方案的棘手部分是找到一个好的种子价值.Collections.shuffle(List, Random) SecureRandom

更新:根据您的澄清,我建议您研究如何播种PRNG(假设您已经使用加密安全实施;如果没有,请先执行此操作).你应该使用一组有限的种子.其他需要考虑的事项:

  • 你可能应该为每个游戏实例化一个PRNG
  • 你应该只是在手中拖着甲板; 从你的问题来看,你并不是100%清楚你也不是在翻牌圈,转牌圈,河牌圈等之间洗牌.


Jac*_*ack 6

Collection.shuffle使用O(N)实施的费雪耶茨洗牌算法.

并且随机索引是用Java的普通PRNG选择的,因此它将大致相同:每个套牌的每次随机播放都与其他任何一个一样.

这对你想做的事情来说是相当不错的,但是当你想要真正的随机化时,你应该引入一些真正的随机因素(比如System.currentTimeMillis()用于播种随机数生成器)或者更像是专用硬件的东西.

  • 当然,您需要使用比System.currentTimeMillis()好得多的东西来播种它 - 请参阅http://www.javamex.com/tutorials/random_numbers/entropy_sources.shtml (2认同)