逆全洗演算法
⑴ 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以及交織洗牌然撲克牌後用隨機數生成函數確定單步洗牌作牌的數量多反復幾遍即可。
的一個合理的定義就是演算法
一副撲克張牌有種陳列方式。
這樣做的好處:
給出的洗牌算演算法應該可以等概率地生成這種結果中的一種
⑸ 奇葩星球新技術,可以讓全人類大腦一秒知識共享,你支持嗎
個人還是不支持這種全人類大腦,一秒知識共享的,首先來說,這個涉及到知識產權保護的問題,另一方面,知識是有價值的,而不是說隨意共享的樣的話,相對來說是不公平的,只有讓知識產生價值,正常的付費才是一種公平合理的方式