逆全洗算法
⑴ C语言 洗牌算法
/*洗牌程序:用任何语言,随机分配52张扑克牌到52个位置上,每个位置只容许放一张牌
用1-13表示红心A--K
14-26表示黑桃A,2,3-,Q,K
27-39表示方块A,2,3-,Q,K
40-52表示黑桃A,2,3-,Q,K
也就是生成1-52不重复的随机数,放到数组中*/
#include<iomanip.h>
#include<stdlib.h>
#include<time.h>
const int N=52;
static int a[N];
int create(int n)
{
return (1+rand()%52);
}
int main()
{
int i,j;
srand(time(0));
for(i=0;i<N;++i)
{
a[i]=create(N);
for(j=0;j<i;++j)
{
if(a[j]==a[i])
{
a[i]=(a[i]+1)%52;
}
}
cout<<setw(5)<<a[i];
}
cout<<endl;
return 0;
}
⑵ 随机洗牌:哪一种算法是正确的
几乎所有的程序员都写过类似于“洗牌”的算法,也就是将一个数组随机打乱后输出,虽然很简单,但是深入研究起来,这个小小的算法也是大有讲究。我在面试程序员的时候,就会经常让他们当场写一个洗牌的函数,从中可以观察到他们对于这个问题的理解和写程序的基本功。 在深入讨论之前,必须先定义出一个基本概念:究竟洗牌算法的本质是什么?也就是说,什么样的洗牌结果是“正确”的? 云风曾经有一篇博文,专门讨论了这个问题,他也给出了一个比较确切的定义,在经过洗牌函数后,如果能够保证每一个数据出现在所有位置的概率是相等的,那么这种算法是符合要求的。在这个前提下,尽量降低时间复杂度和空间复杂度就能得到好的算法。 第一个洗牌算法:随机抽出一张牌,检查这张牌是否被抽取过,如果已经被抽取过,则重新抽取,直到找到没被抽出过的牌,然后把这张牌放入洗好的队列中,重复该过程,直到所有的牌被抽出。 大概是比较符合大脑对于洗牌的直观思维,这个算法经常出现在我遇到的面试结果中,虽然它符合我们对于洗牌算法的基本要求,但这个算法并不好,首先它的复杂度为O(N2),而且需要额外的内存空间保存已经被抽出的牌的索引。所以当数据量比较大时,会极大降低效率。
⑶ 关于牌类游戏洗牌算法一问:怎样才算把牌洗
1. 嵌入式洗牌法
把部分的塔罗牌拿在手中,使牌面朝下,将剩下的牌随意插入手里的牌,再自手中拿出一些牌,再插进去。重复这个步骤直到你觉得牌洗干净了为止。不过这种洗牌方式非常容易折损牌的边缘,要小心喔(有时还会刮伤手…)
2. 推摆洗牌法
将塔罗牌牌面朝下,在桌面上弄混,之后用左手的拇指将最上方的一叠牌推回左手,再用右手拇指推下方的一叠牌到右手,持续重复这个动作,直到所有的牌都被分开,之后重叠再一起并重复这些动作,直到你觉得已经洗干净为止。不过这个方法不是很容易,你必须常常练习才不会打到手(嘿嘿嘿…)
3. 一般正常洗牌法
将塔罗牌牌面朝下,双手以顺时针或逆时针方向将牌均匀混和即可。以上介绍的三种方式均为一般常见的洗牌方法(尤其是第三项,一般市面上的中文塔罗书籍均是以此法为主,故简略带过),在洗牌时一般是建议受占者心中专心默念要问的问题,而占卜师择是专心洗牌。至于是否要由受占者洗牌则是见仁见智。不过殿主向来是由自己洗牌,有时总会遇到‘朋友’想帮‘他的朋友’占卜,而‘他的朋友’并不在现场的情况,若是非当事者洗牌不可,大概这牌也就不需要算了…
至于是否一定要使用这几种方法来洗牌,答案是不一定。只要能将牌充分混和均匀,也不致伤到牌面就好了。
此外,在使用第三种洗牌方式时,殿主提供一些经验分享给大家:
1.转动时要利用指腹与手腕的力量
2.像写书法一样,手腕抬高
3.尽量轻柔地转动每一张牌
4.每一张牌建议尽量转三圈半以上(要公转也要自转喔)
5.注意上层的牌要与下层的牌混合均匀
⑷ 几种扑克牌洗牌算法
洗牌的
几种话先设定好洗牌方式几种比方对分上下交l以及交织洗牌然扑克牌后用随机数生成函数确定单步洗牌作牌的数量多反复几遍即可。
的一个合理的定义就是算法
一副扑克张牌有种陈列方式。
这样做的好处:
给出的洗牌算算法应该可以等概率地生成这种结果中的一种
⑸ 奇葩星球新技术,可以让全人类大脑一秒知识共享,你支持吗
个人还是不支持这种全人类大脑,一秒知识共享的,首先来说,这个涉及到知识产权保护的问题,另一方面,知识是有价值的,而不是说随意共享的样的话,相对来说是不公平的,只有让知识产生价值,正常的付费才是一种公平合理的方式