我們經常用到的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...