引用 | 編輯
csr
2011-03-23 21:29 |
樓主
▼ |
||
x0
有一題目要產生10個-9,-4,1,......,101之任一亂數 小弟只曉得隨意產生 但是指定要在差5的情形下 真的是想了老半天 就是寫不出來 底下是小弟的程式 請 .. 訪客只能看到部份內容,免費 加入會員 x0
|
引用 | 編輯
totsi
2011-03-24 08:43 |
1樓
▲ ▼ |
要有X5..那看起來不像是亂數阿~XD
但如果是要再-9~101之間取亂數的話,那有個前輩講的『撲克牌取排』作弊的方式可以參考。 就是一開始先建立存有-9~101的陣列。 之後在此陣列的邊界內隨機取亂數的索引值。 例如: 1.陣列內,每個值的索引為Index(-9) = 0, Index (-4) = 1, ...., Index(101) = 23。 2.針對0~23取整數的亂數。 3.如有抓到同一個索引值,則在重新抓。 4.抓到10個索引值後,再把先前存於陣列內,對應於的值取出就好。 不知是否有符合您的需求? 不過話說,如果每個亂數都X5的話,那麼比較像是等差級數值吧XDD x1 |
引用 | 編輯
csr
2011-03-24 17:20 |
2樓
▲ ▼ |
下面是引用 totsi 於 2011-03-24 08:43 發表的 : 小弟也不是很清楚 因為才剛學指標與陣列 而且又是自修學習 跟本沒先進可請教 不過還好在此版塊有大大肯不辭勞苦的教導小弟 心中也確實感念不少 所以依大大指引的方向再試看看寫不寫的出來 若不行再向大大討教 謝謝指導 x0 |
引用 | 編輯
csr
2011-03-25 21:22 |
3樓
▲ ▼ |
請教大大們
小弟這樣寫為何無法編譯 可否幫忙找問題 或者小弟那裡錯了 謝謝 #include<stdio.h> #include<stdlib.h> int main(void) { int i,j; int array[23]; int index(-9)=0,index(-4)=1,index(1)=2,index(6)=3,index(11)=4,index(16)=5, index(21)=6,index(26)=7,index(31)=8,index(36)=9,index(41)=10,index(46)=11, index(51)=12,index(56)=13,index(61)=14,index(66)=15,index(71)=16, index(76)=17,index(81)=18,index(86)=19,index(91)=20,index(96)=21, index(101)=22; srand((unsigned)array[23]); for(i=1;i<=10;i+=1) { for(j=-9;j<=101;j+=5) { array[23]=j; j=rand()%23+0; printf("%d. %d\n",i,j); } } system("pause"); return 0; } x0 |
引用 | 編輯
totsi
2011-03-28 09:34 |
4樓
▲ ▼ |
請貼出compiler顯示給您的錯誤訊息嚕^^m
如果找不到要到哪邊看,請按View->Other Window->Error List,裡面會告訴您無法編譯的原因。 這樣幫您找問題的人會比較方便 x0 |
引用 | 編輯
csr
2011-03-28 17:11 |
5樓
▲ ▼ |
下面是引用 totsi 於 2011-03-28 09:34 發表的 :大大您好 上面程式有底下錯誤 expected `,' or `;' before '=' token 小弟再怎麼改都沒用 後來索性小弟將它改成下面這樣 它是可以產生十個亂數 但是都是一成不變的亂數 不知那兒有問題 是否可請大大幫小弟診斷問題所在 謝謝您 以下是所改的程式碼 #include<stdio.h> #include<stdlib.h> int main(void) { int i,j; int num[23]={-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101}; srand(num[23]); for(i=1;i<=10;i++) { for(j=0;j<=22;j++) { num[j]=(-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101); j=rand()%22+0; printf("%d. %d\n",i,num[j]); break; } } system("pause"); return 0; } x0 |
引用 | 編輯
totsi
2011-03-29 17:48 |
6樓
▲ ▼ |
亂數都一致的問題是您的Random seed給的都一樣,所以每次都會產生相同的數值。
亂數在下不熟練,只知道最簡單的方法是把時間拿來當seed來產生新亂數。 至於時間要取到多少,會建議到10ms以下,不過也是要看您的需求而定。 至於compile錯誤的問題,可能是因為在c/c++裡面,陣列的使用是用 [] 來指定陣列位置。所以用 () 就會出錯。 您可以修改看看,說不定會有效。 關於Index(-9) = 0指的是Index函式傳入-9,他會回傳陣列位置0。 所以是屬於數學表示的方式,造成您的誤會,很不好意思。 會建議您先把程式流程用文字敘述先建立好,之後再程式碼,會比較清楚流程。 例如: 1.建立存放-9~101,間距為5的23三個數值的陣列。 2.產生0~23之間之整數亂數 3.確認產生之亂數是否有重複產生 4..... 5..... 以此列推,說不定會對您有幫助^^m x2 |
引用 | 編輯
csr
2011-03-30 15:40 |
7樓
▲ ▼ |
下面是引用 totsi 於 2011-03-29 17:48 發表的 :因為習題的指定 所以才會弄得小弟焦頭爛額 以下小弟再多參考一些書籍或網路問題查詢 看能不能完全解決 謝謝 x0 |
引用 | 編輯
csr
2011-04-04 15:32 |
8樓
▲ ▼ |
終於解決了這一題
該題程式碼如下 可以產生十個指定亂數 #include<stdio.h> #include<stdlib.h> #include <time.h> int main(void) { int i,j; srand((unsigned)time(NULL)); int num[23]={-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101}; for(i=1;i<=10;i++) { for(j=1;j<=22;j++) { num[j]=(-9,-4,1,6,11,16,21,26,31,36,41,46,51,56,61,66,71,76,81,86,91,96,101); j=(rand()%23)+1; printf("%d. %d\n",i,num[j]); break; } } system("pause"); return 0; } x0 |
引用 | 編輯
leacks
2011-04-10 08:45 |
9樓
▲ ▼ |
23個亂數?
既然是-9~101 那就把取到的亂數-9不就好了? rand()%111-9 也不用建啥陣列了 不然就是要用程式建陣列,否則為了這簡單的小程式花時間在那邊建110個陣列,有點浪費時間. x2 |
引用 | 編輯
totsi
2011-04-13 11:42 |
11樓
▲ ▼ |
其實Leacks大所說的用程式建陣列是可行的..因為你是固定間距。
底下的code你可以玩玩看,我沒有測過是否可以complie,如有錯誤的話,可以試著解決: 複製程式 int nArrIndex = 0; //存放陣列的索引 int *narray = new int(23); //建立陣列 for ( int i = -9 ; i <= 101 ; i + 5 ) { if ( nArrIndex > 22 ) { //陣列邊界檢查 break; }; narray[nArrIndex] = i; ++nArrIndex; } 之後的取值的方式,就跟一般陣列的作法一樣。 x0 |
引用 | 編輯
leacks
2011-04-13 21:33 |
12樓
▲ ▼ |
其實等差是可以靠數學公式.
樓上的方法算是自動建陣列,算是一個好處. 但無論室等差or等比都有公式. 因此只要改變要取第幾個值,自然還是ok,不一定要建陣列 === 因為我想這是練習題. 越多方法的告知,能對新手有更多的刺激. 畢竟程式沒有絕對的好,以及絕對的不好.但越多方法可以選時,你未來的撰寫條件就越廣泛. x0 |
引用 | 編輯
iamboss123
2014-01-12 14:35 |
15樓
▲ |
簡單的方法是把時間拿來當seed來產生新亂數。
x0 |