您现在的位置是:爱问

扑克牌洗牌方法 几种扑克牌洗牌算法

2021-04-09 16:27爱问

简介扑克牌洗牌方法洗牌的几种话先设定好洗牌方式几种比方对分上下交l以及交织洗牌然扑克牌后用随机数生成函数确定单步洗牌作牌的数量多反复几遍即可。的一个合理的定义就是算法一副扑克张牌有种陈列方式。这样做的好处:给出的洗牌算...

1

几种扑克牌洗牌算法


1、需要时计算随机的扑克牌。(这种算法需要排除已经出过的牌然后再计算随机因子或者直接取出扑克牌比较,再和前面的扑克牌进行比较,直到不重复为止)

优点:不需要存储整副扑克,资源小,在牌数少的情况下,性能比较好。

缺点:随着已出现扑克牌的数量越来越多,取得随机因子或者重复比较的次数会增加,重复的操作会明显增加,当已现扑克牌的数量50%时就越发明显。

2、开始就随机计算好的整副扑克牌的位置。

优点:操作简单,算好以后就直接从扑克牌数组或者集合中取数就可以了,不需要额外的计算牌的重复,编写程序也会方便一些。

缺点:需要专门一个数组或者集合空间来储存扑克牌,资源稍大一点,如果扑克牌数目很多副的情况下就会明显一些。

3、 多次随机两张牌交换,

以达到牌与牌位置混淆的结果

,由于是完整的牌间位置调换,所以避免了校验牌的过程。
2

3

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


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

C语言 洗牌算法


楼上的,错了,数组写那么长用一个指针表示不就完了吗
5

用C++编写一个洗牌发牌的函数,玩家可能有两个、三个和四个


我也是学习“十步天下”算法写的如下代码,希望对你有帮助!

#include <iomanip.h>//与#include <iostream>有定义的冲突,这里是为stew()函数提供头文件

//#include <iostream>

#include <time.h>

#include <algorithm>

using namespace std;

#define NUM 52

void reset(int* data,int N)

{

for (int i=0;i<N;i++)

{

data[i]=i+1;

}

}

void prn(int* data,int N)

{

for (int i=0;i<N;)

{

cout<<setw(3)<<data[i++]<<" ";

if (i%10==0)

{

cout<<endl;

}

}

cout<<endl;

}

int SWAP_COUNTS=140;//洗牌次数,越大其排序越乱

void shuffle3(int* data, int length)

{

for(int i=0; i<SWAP_COUNTS; i++)

{

//Rand(min, max)返回[min, max)区间内的随机数

int index1 = rand()%length;

int index2 = rand()%length;

std::swap(data[index1], data[index2]);

}

}

void shuffle2(int* data, int length)

{

for(int i=1; i<length; i++)

{

int index = rand()%i;

std::swap(data[i], data[index]);

}

}

void shuffle1(int* data, int length)

{

std::random_shuffle(data, data+length);

}

void main()

{

int Data[NUM];

//算法一

cout<<"算法一:"<<endl;

reset(Data,NUM);

for (int i=0;i<NUM;i++)

{

shuffle1(Data,i);

}

prn(Data,NUM);

//算法二

cout<<"算法二:"<<endl;

reset(Data,NUM);

shuffle2(Data,NUM);

prn(Data,NUM);

//算法三

cout<<"算法三:"<<endl;

reset(Data,NUM);

shuffle3(Data,NUM);

prn(Data,NUM);

//此为算法三的牌分发,可改变上面三种的顺序,这里为最后一个算法的排序分发的

const NUMBER=4;//分牌的人数

const number=NUM/NUMBER;//每个人的牌的张数

int shuffle[NUMBER][number];

for (int j=0;j<NUMBER;j++)

{

for (i=0;i<number;i++)

{

shuffle[j][i]=Data[i*NUMBER+j];

}

}

for (j=0;j<NUMBER;j++)

{

cout<<"第"<<j+1<<"人的牌为:"<<endl;

for (i=0;i<number;i++)

{

cout<<setw(5)<<shuffle[j][i];

}

cout<<endl;

}

}
6

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]); //依次输出 发的牌

        }

    }
追问
那如何控制让他输出不重复呢?
-

以上是关于扑克牌洗牌方法的问答

Tags:扑克牌洗牌方法,几种扑克牌洗牌算法,关于牌类游戏洗牌算法一问