1樓:
一個思路是(全是文字,耐心吧):
定義54個數(0~53),存在陣列裡。
產生n個在0~53的隨機數(建議n取大一點以保證隨機性,但不能太大以免效率低),交換陣列的兩個隨機元素,相當於隨機在牌堆裡交換兩張牌。
這樣做完之後,就產生了一個隨機的1~54的序列。
然後對0~53的每個數規定一個花色和點數。比如規定x屬於0~53,若x/13==0則x花色為黑桃,x%13的餘數加1就是點數;若x/13==1則規定x為紅桃,等等;若x為52則定為小王,x為53則定為大王。這樣牌堆就生成好了,發牌就是從牌堆頂取牌了,即從陣列的0號元素開始取數字,然後解釋它的花色、點數。
2樓:匿名使用者
當年學c時做了一個,後來檔案丟失了,現在都不用c了我自己現在用的是vb的,自己的演算法,只記得,ascii為個位數的2345(好像是)輸出的剛好是4總花色
3樓:匿名使用者
好麻煩,看的暈~~~
第一步:先建立一個陣列裝撲克牌,比如52張就是[51]第二步:用迴圈把陣列填滿數字,1~52
第三步:從1到52中建立一個隨機數i,把陣列中[i]位置的數字放在陣列的倒數第一個位置[51],i位置之後的數字向前移動一個位置
第四步:從1到51中建立一個隨機數i,把陣列中[i]位置的數字放在陣列的倒數第二個位置[50],i位置之後的數字向前移動一個位置
第五步:……
迴圈就可以了
如果是四個人玩,把陣列分成四份就好了。
其實就是提取隨機數放到最後,讓隨機的範圍越來越小,減少計算量
4樓:匿名使用者
rand()是產生隨機數的一個函式~~~~
5樓:匿名使用者
比較簡單的...
#include
#include
#include
void main( void )
;char* p_n = ;
printf("請輸入玩家人數: ");
scanf("%d",&n);
printf("請選擇是否需要大小王(需要請輸入1,不需要請輸入0): ");
scanf("%d",&with_joker );
printf("\n");
total = (with_joker)?54:52;
srand( (unsigned)time( null ) );
iarr = (int*)malloc(total*sizeof(int));
for(int i=1;i<=n;i++)printf("\n\n");
for( i1=0; i1 }for( i1=0; i1 }free(iarr);} 6樓:匿名使用者 #include #include #include #define gauss_table_length 256 #include "random.h" extern float gauss_f[gauss_table_length]; extern float gauss_f[gauss_table_length]; extern dword randomkey,randomkey32; dword mcoef_32[2]=; word mcode_16[4]= ; // two m sequence #define invalid_block 0xffff #define block_size 512 dword m_seq_32(dword key) }return key; }word rng() randomkey = m_seq_32(randomkey^a^b); return (word)randomkey; }dword rng32() randomkey32 = m_seq_32(randomkey32^a^b); return randomkey32; }void normaltable(float *ftable, float * ftable,int length) /*生成正態分佈函式和正態分佈概率密度函式表,表寬度為3倍方差 正態分佈函式均值為0,方差為1 ftable: 正態分佈函式表 ftable: 正態分佈概率密度表 length: 表的長度*/} float normalrng(float * gauss_f, int length) /*生成均值為0,方差為1的高斯隨機數 gauss_f: 正態分佈函式表,規格如上,可以由normaltable函式生成 length: 正態分佈函式表的長度 返回值:均值為0,方差為1的高斯分佈隨機數*/} return randomnumber; }//來自網路 用c++編寫一個洗牌發牌的函式,玩家可能有兩個、三個和四個 7樓:十步天下 幾乎所有的程式設計師都寫過類似於“洗牌”的演算法,也就是將一個陣列隨機打亂後輸出,雖然很簡單,但是深入研究起來,這個小小的演算法也是大有講究。我在面試程式設計師的時候,就會經常讓他們當場寫一個洗牌的函式,從中可以觀察到他們對於這個問題的理解和寫程式的基本功。 在深入討論之前,必須先定義出一個基本概念:究竟洗牌演算法的本質是什麼?也就是說,什麼樣的洗牌結果是“正確”的? 雲風曾經有一篇博文,專門討論了這個問題,他也給出了一個比較確切的定義,在經過洗牌函式後,如果能夠保證每一個資料出現在所有位置的概率是相等的,那麼這種演算法是符合要求的。在這個前提下,儘量降低時間複雜度和空間複雜度就能得到好的演算法。 第一個洗牌演算法: 隨機抽出一張牌,檢查這張牌是否被抽取過,如果已經被抽取過,則重新抽取,直到找到沒被抽出過的牌,然後把這張牌放入洗好的佇列中,重複該過程,直到所有的牌被抽出。 大概是比較符合大腦對於洗牌的直觀思維,這個演算法經常出現在我遇到的面試結果中,雖然它符合我們對於洗牌演算法的基本要求,但這個演算法並不好,首先它的複雜度為o(n2),而且需要額外的記憶體空間儲存已經被抽出的牌的索引。所以當資料量比較大時,會極大降低效率。 第二個演算法: 設牌的張數為n,首先準備n個不容易碰撞的隨機數,然後進行排序,通過排序可以得到一個打亂次序的序列,按照這個序列將牌打亂。 這也是一個符合要求的演算法,但是同樣需要額外的儲存空間,在複雜度上也會取決於所採用的排序演算法,所以仍然不是一個好的演算法。 第三個演算法: 每次隨機抽出兩張牌交換,重複交換一定次數次後結束 void shuffle(int* data, int length) }很明顯,這個演算法是符合我們先前的要求的,時間複雜度為o(n),而且也不需要額外的臨時空間,似乎我們找到了最優的演算法,然而事實並非如此,看下一個演算法。 第五個演算法: void shuffle(int* data, int length) }一個有意思的情況出現了,這個演算法和第三種演算法非常相似,從直覺來說,似乎使資料“雜亂”的能力還要弱於第三種,但事實上,這種演算法要強於第三種。要想嚴格的證明這一點並不容易,需要一些數學功底,有興趣的朋友可以參照一下這篇**,或者matrix67大牛的博文,也可以這樣簡單理解一下,對於n張牌的資料,實際排列的可能情況為n! 種,但第四種演算法能夠產生n^n種排列,遠遠大於實際的排列情況,而且n^n不能被n! 整除,所以經過演算法四所定義的牌與牌之間的交換程式,很可能一張牌被換來換去又被換回到原來的位置,所以這個演算法不是最優的。而演算法五輸出的可能組合恰好是n!種,所以這個演算法才是完美的。 事情並沒有結束,如果真的要找一個最優的演算法,還是請出最終的冠軍吧! 第六個演算法: void shuffle(int* data, int length) 沒錯,用c++的標準庫函式才是最優方案,事實上,std::random_shuffle在實現上也是採取了第四種方法,看來還是那句話,“不要重複製造輪子” 不想寫 - - 8樓:匿名使用者 我也是學習“十步天下”演算法寫的如下**,希望對你有幫助! #include //與#include 有定義的衝突,這裡是為stew()函式提供標頭檔案 //#include #include #include using namespace std; #define num 52 void reset(int* data,int n) }void prn(int* data,int n) }cout< }int swap_counts=140;//洗牌次數,越大其排序越亂 void shuffle3(int* data, int length) }void shuffle2(int* data, int length) }void shuffle1(int* data, int length) void main() prn(data,num); //演算法二 cout<<"演算法二:"< reset(data,num); shuffle2(data,num); prn(data,num); //演算法三 cout<<"演算法三:"< 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 }for (j=0;j cout< 9樓:匿名使用者 #include #include #include #define n 10 #define m 4 #define invalid -1 void xi(int a[n], int nplayer, int player[m][n]) j = 0; while(n > 0) j++;}} void show(int nplayer, int player[m][n]) printf("\n"); }printf("\n"); }int main() ;int player[m][n]; srand(time(null)); xi(a, 2, player); show(2, player); xi(a, 3, player); show(3, player); xi(a, 4, player); show(4, player); return 0;} 把你的思路想好,想要達到什麼樣的功能,思路清晰後就可以一個一個功能的去寫,出錯了不用急,想一下自己錯在什麼地方,好好的看一下 雖然這樣做會花很多 的時間,但是這樣做會提高自己的閱讀分 能力, 牛兒柳兒 啊?書上不是有麼 自己學著寫啊 10.include main printf n 如何編寫c語言程... 首先查詢點座標的位置要素,然後根據空間查詢分析,進行查詢縣要素上的名稱 具體 如下 ipoint point new pointclass point.x 94.82 你要查詢的點座標位置 point.y 32.61 你要查詢的點座標位置 ispatialfilter spatialfilter n... 首先,你需要學會c語言的基礎語法,那麼你就可以寫一些簡單的程式了。想要進階就要進一步專深入學習算屬法等。其次,學習程式語言必須要有興趣,興趣不夠很容易半途而廢。格式的話,養成良好的縮排習慣有助於別人和自己更容易看懂 推薦一本書 寫的很不錯。你還需要安裝ide,推薦安裝vs2012。拓展資料 c語言是...C語言程式程式設計,如何編寫C語言程式
用c編寫arcgisengine程式如何查詢某個欄位裡的
C語言程式設計,如何編寫C語言程式