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

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

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 產生隨機數?

c 中生成指定範圍內的隨機數過程為 設定隨機種子srand 生成隨機數rand n 1,生成1 n之間的隨機數 include include rand srand include void main include include using namespace std int main retu...

如何用c 產生隨機數,如何用C 產生隨機數?

在煙幹辰 rand 這個函式就是產生隨機數的,想要一個範圍的隨機數,可以用取餘數的方式 如取0 99之間的數,可以rand 100 需要使用rand 和srand 函式 rand 為隨機數函式,產生 0,int型最大值 之間的整數數 srand seed 為初始化隨機數種子函式 具體例子如下 inc...

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

水土第一 我幫你寫,還需要嗎? 先上程式 include include include define max buf len 64 define year len 365 int main void double lowtempercity1 year len double hightemperc...