算法练习-随机数
問題表述:生成小于n且沒有重復(fù)的k個整數(shù)的問題。
???????? 輸入:n,k。
???????? 輸出:0-n-1之間的k個不同隨機(jī)順序的隨機(jī)整數(shù)。
?
? 隨機(jī)數(shù)產(chǎn)生函數(shù)為rand(),函數(shù)的作用是生成一個0~RAND_MAX之間的一個隨機(jī)數(shù),返回值是一個unsigned int類型值,代碼如下。
????????? #include?<iostream>??
??????????using?namespace?std;??
????????? void?main()??
????????? {??
???????????????? for?(int?i?=?0;?i?<?10;?++i)??
????????????????????? {??
???????????????????????????? cout<<rand()<<"?";??
????????????????????? ?}??
??????????????? ?cout<<endl;??
????????? }??
????????? 之前看過有一篇博文上說,隨機(jī)數(shù)函數(shù)就好像是在翻字典。系統(tǒng)給你預(yù)設(shè)好一本字典。你來調(diào)用rand()就好像按照順序來一頁一頁翻,所以兩次的運(yùn)行結(jié)果基本是一模一樣的。要想真正的隨機(jī),按理來說是不可能的。但是我們可以加上隨機(jī)數(shù)種子。設(shè)置時間為隨機(jī)數(shù)種子,srand((unsigned)time(NULL));現(xiàn)在調(diào)用rand()就像按照時間的順序來翻字典,時間不停在變,翻字典的順序也在變。這樣就基本實(shí)現(xiàn)了隨機(jī)。
???????? 題目中還要求了產(chǎn)生不相同的隨機(jī)數(shù)。就每產(chǎn)生一個隨機(jī)數(shù),就與之前產(chǎn)生的逐個比較,比較相同就拋棄,重新產(chǎn)生。代碼實(shí)例如下:
?????????? #include<iostream>
?????????? #include<time.h>
???????????using namespace std;
?????????? int main()
????????? {
?????????????? ?int x[1000];???????????? //暫時使用1000
??????????????? int n=0, k=0;
??????????????? cin >> k>> n;
????????????????bool ret = false;????????? //設(shè)置一個標(biāo)記位
?????????????? ?srand((unsigned)time(NULL));?????? //給隨機(jī)數(shù)添加隨機(jī)種子
????????????????for (int a = 0; a < n;a++ )????? //將數(shù)組初始化
????????????????{
????????????????????? ?x[a] = a;
?????????????? ?}
??????????????? int i = 0;
??????????????? while (1)
????????????????{
?????????????????????? ?x[i] = rand() % n+1;????????? //產(chǎn)生第i個隨機(jī)數(shù)
??????????????????????? for (int j = 0; j < i; j++)
??????????????????????? {
?????????????????????????????? ?if (x[i] == x[j])????????? //與之前產(chǎn)生的隨機(jī)數(shù)比較,如果相同就將標(biāo)記為設(shè)為true
????????????????????????????????{
????????????????????????????????????? ret = true;
????????????????????????????????}
?????????????????????? ?}
??????????????????????? if (!ret)?????????? //如果與之前產(chǎn)生的不相同,就產(chǎn)生下一個隨機(jī)數(shù)
??????????????????????? {
???????????????????????????????? i++;
???????????????????????????????? ret = false;
?????????????????????????}
??????????????????????? ?if (i == k)???? //到第k個跳出循環(huán)
???????????????????????? {
??????????????????????????????? ?break;
???????????????????????? }
?????????????? ?}
?????????????? ?for (int c = 0; c < k; c++)? //打印隨機(jī)數(shù)數(shù)組
??????????????? {
??????????????????????? ?cout << x[c] << ' ';
??????????????? }
??????????????? return 0;
???????? }
???????????????? 這個還有一個問題就是如果n和k設(shè)置的過于接近的話,產(chǎn)生隨機(jī)數(shù)的時候會發(fā)生碰撞,在最后幾位隨機(jī)數(shù)產(chǎn)生的過程中會一直產(chǎn)生與之前相同的隨機(jī)數(shù),不斷被拋棄,不斷的產(chǎn)生。這個還需要改進(jìn)。
?
???????????????
轉(zhuǎn)載于:https://www.cnblogs.com/lpl1/p/6801062.html
總結(jié)
- 上一篇: 分享 - 普通程序员如何转向AI方向
- 下一篇: [Material Design] 教你