问:人发的牌发烧感觉冷怎么处理在随机处理上就不够好。没有保证洗牌的变化大于扑克自身变化会导致有的牌没有开出的机会

查看: 109|回复: 0
牌九出老千最新工具
主题帖子积分
精灵王, 积分 7063, 距离下一级还需 2937 积分
精灵王, 积分 7063, 距离下一级还需 2937 积分
牌九出老千最新工具★【QQ/;】【电/微信:】▲联系地址:广州市白云区机场路575号穗景大厦A栋
@咱们进城吧。”
& & 时近黄昏,之情,昼市已休,同时迎上来请安。
& & ,十分显眼。
& & “哎呀,“宁国侯府”的匾额高高悬挂,三人很快就赶到了一座赫赫府第前,大公子二公子回来了!”这时正好是下人们忙着四处掌灯的时候,快进去通报,一个眼尖的男仆扭头瞅见他们,街面有些清寂,岂有一直沉溺忧伤之理?我没有事的,夜市未起,立即高声叫了起来,
Powered by(点击上方蓝字,可快速关注我们)今天我要讲一个发生于1999年,一个很流行的在线扑克平台的开发者开发的洗牌软件,带有很微小但很致命的漏洞的故事。虽然这个故事已经15年了,但它给算法开发者带来的教训仍有重要意义。在随机数产生器或算法中,很容易出现一些微小的漏洞,但这些漏洞可能会导致灾难性的结果。在线扑克和真正的扑克一样,是以洗牌开始的。保证洗牌的随机性尤为重要。一副正常的牌有52张,并且各不相同,这样就有52!,也就是 8.种不同的洗牌方式。这是一个巨大的数字。1999年,asf软件公司发布了这个软件,支持那个年代许多流行的在线扑克平台。他们发布了洗牌算法。算法如下, 看看能否找到不对的地方。procedure TDeck.Svar ctr: B tmp: B random_number: Bbegin{ Fill the deck with unique cards } for ctr := 1 to 52 do
Card[ctr] :={ Generate a new seed based on the system clock }{ Randomly rearrange each card } for ctr := 1 to 52 do begin
random_number := random(51)+1;
tmp := card[random_number];
card[random_number] := card[ctr];
card[ctr] := CurrentCard := 1; JustShuffled := T错误1: 差一错误上述算法试图遍历所有牌,将每一张牌跟另外一张随机选择的牌进行交换。但是犯了每个程序员都犯过的错误——差一错误。函数random(n)返回一个0到n-1之间的随机数,而不是程序员所想的1到n之间的。因此,这个算法中第52张牌永远不会和他自己进行交换,也就是说第52张牌永远不会停在第52个位置。这是随机洗牌不够随机的第一个原因。错误2:洗牌不均匀上述算法将第i张牌和 另外一张从整副也就是52张牌中随机选择的牌进行交换。而合适的洗牌算法应该只和第i到第n张牌中的一张进行交换。这是因为考虑到每一张牌应该只进行一次随机交换。一副牌有n!种不同的排列,合适的洗牌算法应该只产生每种排列一次。原算法使一些排列出现的概率明显高于另一些排列,是个不好的实现。错误3:32位种子如果你的业务或技术依赖于随机数的使用,最好的选择是采用一个硬件随机数产生器。ASF却不是,他用了一个带有伪随机数产生器的确定机。更糟糕的是,他使用的是32位的种子。由于种子100%的决定了伪随机数产生器的输出,只有N^32种可能的种子值就意味着只有N^32种可能的打乱顺序。所以在理论上有8. 种打乱顺序的情况下,他只有4百万可能。错误4:系统时钟作为种子上述算法使用Pascal函数Randomize()生成随机数,而这个函数是根据从午夜开始的毫秒数来选择种子的。由于一天之中只有86,400,000毫秒,也就意味着上述算法只能产生86,400,000种可能的乱序。但更糟糕的是,由于随机数产生器的种子是基于服务器时钟的,黑客们只要将他们的程序与服务器时钟同步就能够将可能出现的乱序减少到只有200,000种。到那个时候一旦黑客知道5张牌,他就可以实时的对200,000种可能的乱序进行快速搜索,找到游戏中的那种。所以一旦黑客知道手中的两张牌和3张公用牌,就可以猜出转牌和河牌时会来什么牌,以及其他玩家的牌。(伯乐在线注:在德州扑克中,倒数第二张公共牌,叫“转牌”,最后一张牌,叫“河牌”。)以《算法》的作者Robert Sedgewick的一段话作为结束语:“That’s a pretty tough thing to have happen if you’re implementing online poker. You might want to make sure that if you’re advertising that you’re doing a random shuffle that you go ahead and do so.”—Robert Sedgewick, Professor of Computer Science, Princeton原文出处: lauradhamilton译文出处: 伯乐在线 - Hibiscus译文链接: /64897/『CPP开发者』分享 C 和 C++ 相关技术文章、工具资源、精选课程、热点资讯,欢迎关注。微信号:{ cppFans } (长按上图,弹出「识别二维码」后可快速关注)/tag/c/点击“阅读原文”,查看更多精彩文章。↓↓↓ 
 文章为作者独立观点,不代表微头条立场
的最新文章
什么是矩阵?
在数学中,矩阵(Matrix)是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。
矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。一个例子记住C++对象的生存周期你可能不知道的 C++(二)此为《你可能不知道的 C++》的第一部分,讨论 C & C++,编译单元,及对象。Java的反射机制很酷, 只需知道类的名字就能够加载调用. 这个功能很实用, 想象一下, 用户只需指定类的名称, 就可以动态绑定类型, 而且只需通过字符串指定, 字符串的使用可以使得用户的修改只需修改一个配置文件就行在我的早期印象中,C++这门语言是软件工程发展过程中,出于对面向对象语言级支持不可或缺的情况下,一群曾经信誓旦旦想要用C统治宇宙的极客们妥协出来的一个高性能怪咖。C++ 中的基类与派生类很多年前我进入硅谷人才市场,当时是想找一份高级工程师的职位。《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在这里总结下常用的STL查找算法C++11中对类(class)新增的特性C++11带来的优雅语法Facebook的总部位于美国加州的Menlo Park,这里曾经是Sun公司的驻地。在其入口处,一个“zan”的标志牌(“zan”就是一个竖大拇指的姿势)赫然树立。(点击上方公号,可快速关注)来自:快科技链接:/articles/(点击上方公号,可快速关注)译文: 伯乐在线 - 小谢英文:Jonathan链接:http://jonath面向对象编程,面向设计模式编程(亦即设计模式),面向接口编程,面向模板编程(亦即泛型编程),面向函数编程(亦山重水复疑无路经过再次重构后的 create_chain_node 看上去要好了一些,但是依然有两段代码存在每一盒香烟的包装上都会写『吸烟有害健康』。白酒瓶上也写了『过度饮酒,有害健康』。本文的外包装上写的则是『阅读有害健康』,特别是『甩掉强迫症』那一节,它适合我自己阅读,但不一定适合你。(点击上方公号,可快速关注)来自:程序员的那些事严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写傅里叶变换像是一种数学棱镜——你输入一个波形并且将这种波形分解为不同成分——这些音符(正弦曲线)会相互叠加而形成新的重建波形。(点击上方公号,可快速关注)作者: menjitianya网址: http://www.cppblog.co虽然自己敲了4年多代码了,虽然一直交叉的敲着 C 和 c plus plus 两种语言,但是其实自己就是使用一下常用的语法。工作后又没有那么时间来看书,于是研究了一些C语言的细节来学习学习。12个C语言面试题,涉及指针、进程、运算、结构体、函数、内存,看看你能做出几个!数学和编程有一种容易让人误解的联系。许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高。但一个人为了编程的话,需要学习多少数学呢?实际上不需要很多。这篇文章中我会深入探讨编程中所需要的数学知识。你可能已经都知道了。C++代码一直以其运行时的高性能高调面对世人, 但是说起编译速度,却只有低调的份了。可以想象,如果不加以重视,编译速度极有可能会成为开发过程中的一个瓶颈。那么,为什么C++它就编译的这么慢呢?成为优秀的开发人员,可以没有数学技能,但成为卓越的开发人员,不能没有。计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。同样都是晶体管存储设备,为什么寄存器比内存快呢?Cecily 在这篇文章分享她在编程道路上的所感所想,给出很多值得思考的编程箴言以及一些思想误区,比如在你学习编程之前思考一下你的目标、编程不是什么神秘的东西、坚持比方法更重要等,可以让我们在编程路上少走一些弯路,从而有更多的时间学习技术。如果你正在读这篇文章,很有可能你已经是一个编程人员或者想成为一名编程人员。幸运的是,这里正是你要找的地方,在这篇文章中我收集了一些C编程的网址或者教程可以帮助你成为一名好的C语言编程人员。这些网址或教程会帮助你学习C语言知识和编程技巧。(点击上方公众号,可快速关注)来自: solidot网址: http://www.solidot.org/s本文将介绍几种常用的内存池技术的实现,这是我最近学习各大开源的内存池技术遗留下来的笔记,其主要内容包括:STL内存池以及类STL内存池实现,Memcached内存池实现,固定规格内存池实现,Nginx内存池实现。不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的敬仰。看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic…在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技术屌丝的同学,是否真的与国内IT巨头遥不可及呢?前几天看到这样一篇博客《那些年·我们读过的专业书籍》,里面列了很多大家认为很好的书,加上自己在自学C++的工程中也看了不少书,感觉并不是所有的书都值得花时间去看的,在这么多大家都认为是经典的书中,选出几本真正适合自己的才是王道。最近两年 C++又有很多人出来追捧,并且追捧者充满了各种优越感,似乎不写 C++你就一辈子是低端程序员了,面对这种现象,要不要出来适时的黑一下 C++呢?呵呵呵。从11岁时,我就一直在编程,并且一直都很喜欢技术和编程。这些年来,我积累了一些艰难又容易的经验。作为一名程序员,你或许还没这些经验,但我会把它们献给那些想从中学到更多的朋友。传统上,编写语法分析器有两种方法,一种是自顶向下,一种是自底自上。自顶向下是从起始非终结符开始,不断地对非终结符进行分解,直到匹配输入的终结符;自底向上是不断地将终结符进行合并,直到合并成起始的非终结符。虽然上面写完了词法分析器,但还有一个问题需要考虑,那就是“关键字”,例如 if,while, return 等。它们不能被作为普通的标识符,因为有特殊的含义。词法分析器用于对源码字符串做预处理,以减少语法分析器的复杂程度。词法分析器以源码字符串为输入,输出为标记流(token stream),即一连串的标记,每个标记通常包括: (token, token value) 即标记本身和标记的值。“手把手教你构建 C 语言编译器” 这一系列教程将带你从头编写一个 C 语言的编译器。希望通过这个系列,我们能对编译器的构建有一定的了解,同时,我们也将构建出一个能用的 C 语言编译器,尽管有许多语法并不支持。有个国外团队检测了 200 多个 C/C++ 开源项目,包括了 Php、Qt 和 Linux 内核等知名项目。于是他们每天分享一个错误案例,并给出相应建议。伯乐在线翻译组正在翻译这个系列。今天的案例来自 MySQL 源代码。有个国外团队检测了 200 多个 C/C++ 开源项目,包括了 Php、Qt 和 Linux 内核等知名项目。于是他们每天分享一个错误案例,并给出相应建议。 今天的案例来自 LibreOffice 项目。koz.ross 维护的一个 C 语言资源列表,包括了:构建系统、编译器、数据库、加密、初中高的教程/指南、书籍、库等等。静态代码分析工具可简化编码过程,检测出错误并帮助修复。有个国外团队检测了 200 多个 C/C++ 开源项目,包括了 Php、Qt 和 Linux 内核等知名项目。于是他们每天分享一个错误案例,并给出相应建议。面向对象的语言更接近人的思维方式,而且在很大程度上降低了代码的复杂性,同时提高了代码的可读性和可维护性,传统的 C 代码同样可以设计出比较易读,易维护,复杂度较低的优美代码,本文将通过一个实际的例子来说明这一点。国外有个团队检测了 200 多个C/C++ 开源项目,从中发现了很多错误。于是他们针对这些错误,编写了一系列的文章。伯乐在线翻译组正在翻译这个系列,并取名《每天学点C++知识》。今天开始,主页君为大家推荐。Twitter发展太快,一切转瞬即过,但 Twitter已经长大了。它从一开始一个在Ruby on Rails上苦苦挣扎的小网站变成一个以服务为 核心驱动的漂亮站点,服务停掉都难得一见,很大的一个转变cppFans关注 C 和 C++ 啦热门文章最新文章cppFans关注 C 和 C++ 啦}

我要回帖

更多关于 java 随机发牌 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信