Re: [問題] 產生N個不重複的數列

看板C_and_CPP (C/C++)作者 (清新、健康、專業)時間14年前 (2011/07/21 21:49), 編輯推噓0(0016)
留言16則, 5人參與, 最新討論串3/4 (看更多)
: for(g=1;g<=n;g++) : { : for(j=1;j<=n;j++) : { : temp = rand()%n+1; //一開始就隨機產生一個數字 : for(k=1;k<=n;k++) : { : if(temp == jtemp[k]) //根據temp的值一直去找相同的數值 : { : j1 = temp; : A1[j] = j1; : jtemp[k] = 0; //另以找過的數字為0,為不找到重複的數值 : printf("%.f ",A1[j]); : break; : } : } : } : } 這個要三層迴圈,其實有比較好的做法 推文也有寫到,類似洗牌的做法 想像一下有 N 張牌,依序標記 1 ~ N 每次隨便取一張出來,取後不放回 寫成程式大概像這樣 int A[] = {1, 2, 3, 4, 5, 6, 7}; for (i = N - 1; i > 0; i--) { rand_num = rand() % (i+1); if (i == rand_num) continue; swap(A[i], A[rand_num]); } C++ 的話,有提供 shuffle 能一行搞定... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.213.253

07/22 00:28, , 1F
那個需求不同,你指的是有限範圍中取不重複數字,但原po似乎
07/22 00:28, 1F

07/22 00:28, , 2F
要實數中取不重複數字.
07/22 00:28, 2F

07/22 00:43, , 3F
即使是要從實數裡取不重複的數字
07/22 00:43, 3F

07/22 00:44, , 4F
但是他的宣告仍然有範圍限制呀~~
07/22 00:44, 4F

07/22 00:46, , 5F
我沒意會錯的話,Kunth shuffle,裡面的 if 是該拿掉的.
07/22 00:46, 5F

07/22 00:56, , 6F
..請無視5F,誤會一場 XD
07/22 00:56, 6F

07/22 01:31, , 7F
錯,同樣有範圍限制,實數跟整數差很多
07/22 01:31, 7F

07/22 01:42, , 8F
@yauhh:你似乎誤會我的意思了...
07/22 01:42, 8F

07/22 01:42, , 9F
我是指儲存的size是受限的...
07/22 01:42, 9F

07/22 01:46, , 10F
所以也可以用類似的方法去產生呀~~
07/22 01:46, 10F

07/22 05:28, , 11F
所謂實數是指rand產生的數字嗎?那這個例子只要改成for
07/22 05:28, 11F

07/22 05:29, , 12F
塞進去就好,在洗牌就好.
07/22 05:29, 12F

07/22 05:31, , 13F
實際上我寫過類似原po的方法,因為是亂數產生數字
07/22 05:31, 13F

07/22 05:32, , 14F
不論你怎麼檢查數值,還是會有重複的可能.所以採用洗牌法
07/22 05:32, 14F

07/23 19:26, , 15F
插話:現今電腦是沒辦法處理實數的,浮點數和實數不一樣。
07/23 19:26, 15F

07/24 01:21, , 16F
看的懂就好 何必挑語病呢...
07/24 01:21, 16F
文章代碼(AID): #1EA2w74D (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EA2w74D (C_and_CPP)