C語言生成不重複的隨機數並實現洗牌發牌

2021-09-27 01:54:28 字數 1792 閱讀 7242

我們經常用到的rand函式產生的隨機數通常遇到兩個問題

執行兩次產生隨機數相同

如果我們不呼叫用隨機數發生器初始化(隨機數種子)那麼隨機數函式種子預設為1多次產生隨機數的起點一樣,所以我們呼叫srand(time(0))就可以改變隨機數種子.

產生的隨機數中有重複

那如何產生多次產生的隨機數不同又不重複呢? rand函式產生的隨機數本身重複率是比較低的,但是當我們用取餘產生的一定範圍的隨機數會大大增加重複的概率.比如我要取0-10內的數rand()%10+1

rand產生的10 20120 230 340…其隨機數都為1

以下程式就是c語言將重複剔除

源程式

/** author :jill

* data :2019-9-11

* function:c語言生成一定範圍的隨機數,且不重複,

* 本例程生成1~52的隨機數.

*/#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#include"time.h"

int arr[52]

;int check

(int arg)

return0;

}int main()

return0;

}

程式2發牌遊戲

#include"stdio.h"

#include"stdlib.h"

#include"string.h"

#include"time.h"

int arr[52]

;int i=0;

int check

(int arg)

return0;

}/*洗牌產生不同的52位隨機數*/

int xp()

}/*發牌將52張牌輪流發個四個人每人十三張*/

voidfp(

)printf

("\n");

printf

("第二個人的牌為:");

for(i=

0;i<

13;i++

)printf

("\n");

printf

("第三個人的牌為:");

for(i=

0;i<

13;i++

)printf

("\n");

printf

("第四個人的牌為:");

for(i=

0;i<

13;i++

)printf

("\n");

}/*主函式*/

int main()

jill@desktop-eic0724:~/mydemo/task2$ ./a.out

第乙個人的牌為:27 6 17 25 47 23 51 29 4 11 5 33 50

第二個人的牌為:49 35 31 7 10 42 34 44 39 46 2 30 38

第三個人的牌為:28 40 3 19 14 8 15 22 12 32 41 48 43

第四個人的牌為:21 45 18 24 16 13 36 52 20 26 9 1 37

不重複隨機數生成

直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...

C 生成不重複的隨機數

在做洗牌演算法的時候用到了隨機數,並且產生的隨機數中不能有重複的元素,因為是用c語言實現的,就把值賦給陣列,然後用隨機數產生陣列的下標,每產生乙個就刪除對應的元素,然後隨機數的生成範圍減一,但是這樣做每次都要迴圈去移動陣列元素,從時間複雜度上來說這樣並不好。於是,後來用c 重新實現 實現的思路並沒有...

C 生成不重複的隨機數

private string rndomstr int codelength string code int temp 1 記錄上次隨機數值,盡量避避免生產幾個一樣的隨機數 random rand new random 採用乙個簡單的演算法以保證生成隨機數的不同 for int i 1 i code...