洗牌算法js(洗牌算法实现)
如何设计一个公平的洗牌算法
可以使用knuth洗牌算法。
Knuth洗牌算法:对于有n个元素的数组来说,为了保证洗牌的公平性,应该要能够等概率的洗出n!种结果。开始数组中有五个元素,在前五个数中随机选一个数与第五个数进行交换,每个数都有五分之一的概率被交换到最后一个位置;。
在前四个数中随机选一个数与第四个数进行交换,每个数都有五分之一的概率被交换到第四个位置。在前三个数中随机选一个数与第三个数进行交换,每个数都有五分之一的概率被交换到第三个位置。综上所述,每个数都有相等的概率被放到任意一个位置中,即每个位置中出现任意一个数的概率都是相同的,这就是公平的洗牌算法。
洗牌的方法
里夫鲁式洗牌法,是难度特别高,也特别酷炫的洗牌法。右手持牌,拇指放在一端,其余三指放在另一端,食指弯曲贴于牌的背面。然后将左手食指伸直,上心向上,放于牌的前端,这时轻轻放松右手拇指,使牌的下部分落在左手指尖上。将左手食指指尖放在左手牌的背面。左手手指弯曲,在右手协助下,树起左手的牌。
用左手拇指拿起左手的牌的上端。这时,要左手手指持牌动作与右手一致。将两手的牌弯曲大致相同的弧度,注意使除拇指外的其余四指都保持弯曲,并使两手的牌上端相对。然后将手指伸出,与其余三指并列在一起。这时,控制好拇指的力量,并逐渐放松其余手指。然后牌便会飞在一起。用双手使牌叠在一起,完成整个过程。
关于牌类游戏洗牌算法一问:怎样才算把牌洗
1. 嵌入式洗牌法
把部分的塔罗牌拿在手中,使牌面朝下,将剩下的牌随意插入手里的牌,再自手中拿出一些牌,再插进去。重复这个步骤直到你觉得牌洗干净了为止。不过这种洗牌方式非常容易折损牌的边缘,要小心喔(有时还会刮伤手…)
2. 推摆洗牌法
将塔罗牌牌面朝下,在桌面上弄混,之后用左手的拇指将最上方的一叠牌推回左手,再用右手拇指推下方的一叠牌到右手,持续重复这个动作,直到所有的牌都被分开,之后重叠再一起并重复这些动作,直到你觉得已经洗干净为止。不过这个方法不是很容易,你必须常常练习才不会打到手(嘿嘿嘿…)
3. 一般正常洗牌法
将塔罗牌牌面朝下,双手以顺时针或逆时针方向将牌均匀混和即可。以上介绍的三种方式均为一般常见的洗牌方法(尤其是第三项,一般市面上的中文塔罗书籍均是以此法为主,故简略带过),在洗牌时一般是建议受占者心中专心默念要问的问题,而占卜师择是专心洗牌。至于是否要由受占者洗牌则是见仁见智。不过殿主向来是由自己洗牌,有时总会遇到『朋友』想帮『他的朋友』占卜,而『他的朋友』并不在现场的情况,若是非当事者洗牌不可,大概这牌也就不需要算了…
至于是否一定要使用这几种方法来洗牌,答案是不一定。只要能将牌充分混和均匀,也不致伤到牌面就好了。
此外,在使用第三种洗牌方式时,殿主提供一些经验分享给大家:
1.转动时要利用指腹与手腕的力量
2.像写书法一样,手腕抬高
3.尽量轻柔地转动每一张牌
4.每一张牌建议尽量转三圈半以上(要公转也要自转喔)
5.注意上层的牌要与下层的牌混合均匀
Fisher Yates 洗牌算法
Fisher–Yates shuffle是一种基于有限序列产生随机排列的算法。因为每次抽取每个元素都是等概率的,所以该算法产生一个无偏排列:每个排列的可能性相等。
Fisher–Yates shuffle最开始描述在 Ronald Fisher and Frank Yates 的 Statistical tables for biological, agricultural and medical research 一书中。
A到H的排列
抽取1-8之间的随机数
保存对应位置的元素到结果,并删除原始排列中的元素
原始方法会花费不必要的时间来计算上面第3步中剩余的数字;新方法做出改进,就是将挑选的元素和最后一个元素进行互换。
相反方向的排列
A到H的排列
抽取1-8之间的随机数
保存对应位置的元素到结果,并删除原始排列中的元素
# 原文:
Fisher–Yates shuffle
Shuffle a given array using Fisher–Yates shuffle Algorithm
几种扑克牌洗牌算法
洗牌的
几种话先设定好洗牌方式几种比方对分上下交l以及交织洗牌然扑克牌后用随机数生成函数确定单步洗牌作牌的数量多反复几遍即可。
的一个合理的定义就是算法
一副扑克张牌有种陈列方式。
这样做的好处:
给出的洗牌算算法应该可以等概率地生成这种结果中的一种
JS随机数组排重
用查找数组去重复的效率极低,应该用Object或者JS2015的Set对象做
const?s?=?new?Set();
while(s.size10)
s.add(parseInt(Math.random()*10));
console.log(s);
Set?{?2,?7,?0,?4,?9,?3,?6,?1,?8,?5?}
读下来你的代码,好像在写随机一共10以内10个数还要去重。就可能不是要为了去重,而是想数组洗牌,就该用常见的算法。
function?shuffleArray(a)?{
???for(var?i=a.length-1;?i0;?i--)?{
???????var?j?=?Math.floor(Math.random()?*?(i?+?1));
???????var?t=?a[i];?a[i]?=?a[j];?a[j]?=?t;
???}
}
const?a=[];
for(var?i=0;i10;i++)?a.push(i);
shuffleArray(a)
console.log(a);
[?0,?6,?7,?8,?3,?5,?1,?2,?4,?9?]