如何用C 編寫隨機發牌的程式,如何用C 編寫一個隨機發牌的程式?

時間 2021-07-01 02:07:54

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;}

C語言程式程式設計,如何編寫C語言程式

把你的思路想好,想要達到什麼樣的功能,思路清晰後就可以一個一個功能的去寫,出錯了不用急,想一下自己錯在什麼地方,好好的看一下 雖然這樣做會花很多 的時間,但是這樣做會提高自己的閱讀分 能力, 牛兒柳兒 啊?書上不是有麼 自己學著寫啊 10.include main printf n 如何編寫c語言程...

用c編寫arcgisengine程式如何查詢某個欄位裡的

首先查詢點座標的位置要素,然後根據空間查詢分析,進行查詢縣要素上的名稱 具體 如下 ipoint point new pointclass point.x 94.82 你要查詢的點座標位置 point.y 32.61 你要查詢的點座標位置 ispatialfilter spatialfilter n...

C語言程式設計,如何編寫C語言程式

首先,你需要學會c語言的基礎語法,那麼你就可以寫一些簡單的程式了。想要進階就要進一步專深入學習算屬法等。其次,學習程式語言必須要有興趣,興趣不夠很容易半途而廢。格式的話,養成良好的縮排習慣有助於別人和自己更容易看懂 推薦一本書 寫的很不錯。你還需要安裝ide,推薦安裝vs2012。拓展資料 c語言是...