看板 C_and_CPP 關於我們 聯絡資訊
: 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
yauhh:那個需求不同,你指的是有限範圍中取不重複數字,但原po似乎 07/22 00:28
yauhh:要實數中取不重複數字. 07/22 00:28
firejox:即使是要從實數裡取不重複的數字 07/22 00:43
firejox:但是他的宣告仍然有範圍限制呀~~ 07/22 00:44
tropical72:我沒意會錯的話,Kunth shuffle,裡面的 if 是該拿掉的. 07/22 00:46
tropical72:..請無視5F,誤會一場 XD 07/22 00:56
yauhh:錯,同樣有範圍限制,實數跟整數差很多 07/22 01:31
firejox:@yauhh:你似乎誤會我的意思了... 07/22 01:42
firejox:我是指儲存的size是受限的... 07/22 01:42
firejox:所以也可以用類似的方法去產生呀~~ 07/22 01:46
angleevil:所謂實數是指rand產生的數字嗎?那這個例子只要改成for 07/22 05:28
angleevil:塞進去就好,在洗牌就好. 07/22 05:29
angleevil:實際上我寫過類似原po的方法,因為是亂數產生數字 07/22 05:31
angleevil:不論你怎麼檢查數值,還是會有重複的可能.所以採用洗牌法 07/22 05:32
Favonia:插話:現今電腦是沒辦法處理實數的,浮點數和實數不一樣。 07/23 19:26
firejox:看的懂就好 何必挑語病呢... 07/24 01:21