您当前的位置:首页 > 养生 > 内容

JAVA题求解(尽量简单)?随机洗牌:哪一种算法是正确的

第一个洗牌算法:随机抽出一张牌,JAVA题求解(尽量简单)创建一个card类,至少有2个属性,花色和大小,然后嵌套2个循环,外循环13次(1到13),内循环4次(4种花色),创建一个deskofcards类,该类里有个list集合,把创建的13*4=52张牌放入集合内,然后打乱集合(list有方法可以打乱集合,这个动作就是洗牌),从集合内顺序remove一个(发一张牌),查看list剩余大小(报告剩余牌得数量),到这里就ok了关于洗牌,有个随机洗牌的算法,你有兴趣可以去搜下.还有一个随机发牌的思路.使用随机数产生一个0到1的随机数,然后乘以list的size(注意这里是乘以size不是52,因为随着你发牌,size的大小会变化),取整得到i,然后list.get(i)同时要remove这张牌,也是随机发牌的思路.以上2种发牌得思路实际是1.你先洗牌然后顺序发牌 2.你发牌的时候是随机从牌里抽了一张,但是牌是顺序放的. 这就是一个由业务需求转化为设计或者code的过程,自己应该多做点.随机洗牌:哪一种算法是正确的几乎所有的程序员都写过类似于“洗牌”的算法,请设计一个随机洗牌算法,必须先定义出一个基本概念:究竟洗牌算法的本质是什么,解决方案:这里只给出一个可以使用数学证明每张牌出现在任何位置概率为1/N的算法,怎么证明这个洗牌算法是随机的有一副牌假设有N张,虽然它符合我们对于洗牌算法的基本要求,尽量降低时间复杂度和空间复杂度就能得到好的算法。

JAVA题求解(尽量简单)

创建一个card类,至少有2个属性,花色和大小,然后嵌套2个循环,外循环13次(1到13),内循环4次(4种花色),创建一个deskofcards类,该类里有个list集合,把创建的13*4=52张牌放入集合内,然后打乱集合(list有方法可以打乱集合,这个动作就是洗牌),从集合内顺序remove一个(发一张牌),查看list剩余大小(报告剩余牌得数量),到这里就ok了关于洗牌,有个随机洗牌的算法,你有兴趣可以去搜下.还有一个随机发牌的思路.使用随机数产生一个0到1的随机数,然后乘以list的size(注意这里是乘以size不是52,因为随着你发牌,size的大小会变化),取整得到i,然后list.get(i)同时要remove这张牌,也是随机发牌的思路.以上2种发牌得思路实际是1.你先洗牌然后顺序发牌 2.你发牌的时候是随机从牌里抽了一张,但是牌是顺序放的. 这就是一个由业务需求转化为设计或者code的过程,自己应该多做点.

随机洗牌:哪一种算法是正确的

几乎所有的程序员都写过类似于“洗牌”的算法,也就是将一个数组随机打乱后输出,虽然很简单,但是深入研究起来,这个小小的算法也是大有讲究。我在面试程序员的时候,就会经常让他们当场写一个洗牌的函数,从中可以观察到他们对于这个问题的理解和写程序的基本功。 在深入讨论之前,必须先定义出一个基本概念:究竟洗牌算法的本质是什么?也就是说,什么样的洗牌结果是“正确”的? 云风曾经有一篇博文,专门讨论了这个问题,他也给出了一个比较确切的定义,在经过洗牌函数后,如果能够保证每一个数据出现在所有位置的概率是相等的,那么这种算法是符合要求的。在这个前提下,尽量降低时间复杂度和空间复杂度就能得到好的算法。 第一个洗牌算法:随机抽出一张牌,检查这张牌是否被抽取过,如果已经被抽取过,则重新抽取,直到找到没被抽出过的牌,然后把这张牌放入洗好的队列中,重复该过程,直到所有的牌被抽出。 大概是比较符合大脑对于洗牌的直观思维,这个算法经常出现在我遇到的面试结果中,虽然它符合我们对于洗牌算法的基本要求,但这个算法并不好,首先它的复杂度为O(N2),而且需要额外的内存空间保存已经被抽出的牌的索引。所以当数据量比较大时,会极大降低效率。

怎么证明这个洗牌算法是随机的

有一副牌假设有N张,请设计一个随机洗牌算法。解决方案:这里只给出一个可以使用数学证明每张牌出现在任何位置概率为1/N的算法。Poker[N]for (i = 0; i 《 N; ++i){k = rand() % ( i + 1)if (i != k){switch(Poker[k], Poker[i]);}

java洗牌算法问题

你指的是Card里的toString方法吧

 public String toString() {  String aa = suit + “ “ + num + “  “;  return aa; }

toString这个方法一般在 System.out.print时使用,这个是打印出String,JVM就是默认调用类的toSting方法

 

注:所有类都有toString方法,默认是当前对象的hashcode,即内存地址

 

所以在发牌是打印

 public void dealcard()//发牌    {        for(int i=0;i《52;i++)        {            if(i%4==0&&i!=0){             System.out.println();  //每发4张牌输出换行            }            // 就是这里,默认调用card的toString方法             System.out.print(card[i]); //依次输出 发的牌        }    }


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 雨林木风ylmf os(雨林木风是什么系统)

下一篇: g开头的是和谐号还是复兴号,g开头的是复兴号嘛(郑州铁路局首次上线运行“复兴号”动车组)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号