匿名使用者
匿名使用者 發問時間: 電腦與網際網路程式設計 · 8 年前

請問下列程式不重複隨機亂數的用法

程式碼內容如下列網址連結...麻煩各位大大

http://www.javaworld.com.tw/jute/post/view?bid=29&...

已更新項目:

沒人嗎?@@

2 個已更新項目:

Cola大大 你說的跟書上的解釋一樣,但不好意思我還是有點不懂ㄟ

for(i=0;i

3 個已更新項目:

Cola大大 你說的跟書上的解釋一樣,但不好意思我還是有點不懂ㄟ。

for(i=0;i

4 個已更新項目:

為啥不能貼問題.....

2 個解答

評分
  • Cola
    Lv 5
    8 年前
    最佳解答

    tot_no照變數的名稱就是總陣列元素

    rem_no就是剩餘可抽取t陣列元素個數

    位啥不用tot_no就好?

    直接用tot_no也可以,不過程式碼會變得不易讀

    除錯時也容易混淆

    2012-02-12 23:49:48 補充:

    rem_no-1就是t陣列剩餘可抽取元素的最後一個元素的位置

    那段迴圈目的是要清掉t[t_no]的值

    它的作法是將t陣列t_no+1以後的值都往前位移1位

    2012-02-14 00:55:21 補充:

    迴圈條件為小於rem_no-1

    假設j=t_no為50,也就是陣列最後1個可抽取元素的位置(rem_no-1)

    50<51-1,那條件就不會成立,迴圈也不會跑

    因為是最後1個位置,rem_no只要減1就行了

    2012-02-15 00:26:45 補充:

    它迴圈的條件,就是要排除最後1個元素

    如果它是最後1個元素,後面就沒有元素需要往前移

    不需跑迴圈,只需rem_no-1就可以

    我用下面來解釋好了

    ps:<>代表剩餘可用元素最後1個位置

    假設t陣列=[5],[6],[7],[8],[9],<10>

    剩餘可用元素就是rem_no=6

    現在亂數取值剛好是最後1個元素,t_no = 5

    j<5(rem_no-1),迴圈條件不成立

    那現在是不是只要將rem_no減1就可以了

    剩餘可用元素變為rem_no=5

    t陣列=[5],[6],[7],[8],<9>,[10]

    2012-02-15 00:28:43 補充:

    繼續上面若再取1次亂數

    目前t陣列=[5],[6],[7],[8],<9>,[10]

    剩餘可用元素為rem_no=5

    現在亂數取值為 t_no = 2

    j<4(rem_no-1),條件成立,開始跑迴圈

    第1次迴圈:j=2,t[2]=t[3]

    第2次迴圈:j=3,t[3]=t[4]

    j=4,條件不成立,跳出迴圈

    現在剩餘可用元素變為rem_no=4個

    t陣列=[5],[6],[8],<9>,[9],[10]

    依此類推...

    2012-02-17 01:15:27 補充:

    Math.random()會傳回1個正double值,大於或等於0.0,小於1.0

    當它跟某數值n相乘,所得的值最小為0.0,最大值永遠不會比n大

    假如n=10,現在i=Math.random()*10,傳回的值i最小為0.0,最大就是9.9999999....

    再用Math.floor這個方法取得最接近且數值較小的整數

    例如:Math.floor(2.55),會傳回2.0

    Math.floor(1.0),會傳回1.0

    現在將n代入Math.floor(n),則傳回的值最小為0.0,最大就是9.0

    再用(int)把它轉型為整數

    2012-02-17 01:17:34 補充:

    t_no=(int)Math.floor(Math.random()*rem_no);

    所以這段t_no的數值會介於0~rem_no-1

    OData.GenRnd(data,min,max,rnd_no);

    這段是自定義方法,BBKMath類別的方法

    設計時需要哪些參數可自己定義

    當然方法定義好了,就要照它的規則

    data:用來放亂數的陣列,依tot_no值來定義,int[] data=new int[tot_no];

    min:最小亂數值

    max:最大亂數值

    rnd_no:要取得的亂數個數

    了解它的用法,就不需死背

    2012-02-20 00:37:03 補充:

    1.另外我看不懂主程式跟類別關連,OData.GenRnd(data,min,max,rnd_no);是把data存入int [] x,把min跟max和rand_no依序存入類別BBKMath是這個意思嗎?

    主程式就是有包含程式的進入點

    也就是有下面這個main方法,也就是程式的進入點

    public static void main(String[]args){

    ....................

    }

    OData.GenRnd(data,min,max,rnd_no);

    是傳遞參數data,min,max,rnd_no給OData的GenRnd方法

    data是陣列,傳遞的是陣列的位址,min,max,rnd_no則都是傳值

    在GenRnd方法中的x陣列跟在Hello宣告的data是同一個陣列

    min,max,rnd_no則跟在Hello宣告的變數非同一個變數,只不過值相同

    2.那我能不能直接輸入數字OData.GenRnd(x,x,x,x);因為就不用再主程式多宣告變數

    可以,至少可以簡化如下

    OData.GenRnd(data,50,100,rnd_no);

    data為必要,rnd_no最好保留

    不過明確的宣告min,max可以讓程式更易讀

    Helloo.java的問題:

    是public class Hello放錯位置,不能放在class CFrame裡

    將它搬到class CFrame外面就可以了

    檔名應該改為Hello,需跟public class同名

    像下面這樣

    public class Hello{

    public static void main(String[]args){

    CFrame frame=new CFrame();

    }

    }

    class CFrame extends JFrame implements ActionListener{

    ................

    }

    還有就是若不要用預設Layout,在還沒有加入元件之前,就要先設定好Layout

    CFrame(){

    setLayout(null);//將setLayout搬到最上面

    ........

    ........

    }

  • 8 年前

    喔喔 我是過了用TOT_NO也可以用

    那我在請問一下

    1.for(j=t_no;j<(rem_no-1);j++) rem_no-1的意思是?

    2012-02-13 23:39:28 補充:

    11-16行這裡(抱歉程式碼PO不上來)

    1. t_no=(int)Math.floor(Math.random()*rem_no); 取5個50-100亂數並存入t_no值

    x[i]=t[t_no]; 將亂數t_no放入陣列x中

    for(j=t_no;j<(rem_no-1);j++){

    t[j]=t[j+1];}

    這段我就不太懂了,課文是寫說將t[t_no]以後的資料往前移,單不看程式碼以演算法來看的話我懂意思 但是配合了程式碼就有點不了解。假如j=t_no為50,那位啥要以j<(rem_no-1)不就是50<51-1?後面的這樣子就很怪

    2012-02-14 21:27:36 補充:

    . t_no=(int)Math.floor(Math.random()*rem_no); 取5個50-100亂數並存入t_no值 第一次取亂數取到50 然後放入x[i]陣列中 但for(j=t_no;j<(rem_no-1);j++){

    t[j]=t[j+1];} 這段的意思不是把位置往前移嗎? 那如果50<51-1那下面的就不會執行

    那我才取一次亂數 後面的位置不是都要往前移 那下面都不能執行了要怎麼往前移動? 抱歉 問題有點多在加上我理解力沒這麼強 可以舉個例子?

    2012-02-16 21:33:12 補充:

    喔 感謝 我了解了~~~ 那在請問一下

    t_no=(int)Math.floor(Math.random()*rem_no);

    跟OData.GenRnd(data,min,max,rnd_no);

    這兩個只能夠死背嗎? 它的用法怎用? 第一個應該是隨機取得rem_no位子?

    那第二個就是取最大跟最小值裡面的亂數?

    我這樣說有錯嗎? 裡面的意思個代表什麼?

    2012-02-19 13:46:58 補充:

    Cola大大 你在意見發表我沒辦法給你最佳答案

    1.另外我看不懂主程式跟類別關連,OData.GenRnd(data,min,max,rnd_no);是把data存入int [] x,把min跟max和rand_no依序存入類別BBKMath是這個意思嗎?

    2.那我能不能直接輸入數字OData.GenRnd(x,x,x,x);因為就不用再主程式多宣告變數

    2012-02-19 22:52:23 補充:

    另外可以問妳一個問題 https://skydrive.live.com/?cid=9DE8ECE116BD3FA3&id... 這個程式碼我執行時發生了一個小錯誤

    public static void main(String[]args){

    modifier 'static' is only allowed in constant variable declarations

    我視了很多次都不知道問題出在哪

還有問題?馬上發問,尋求解答。