2012-06-03 106 views
-3

這是我的家庭作業:使用隨機數發生器整數隨機排列

Random r = new Random(); 
public int get100RandomNumber() { 
    return 1+r.nextInt(100); 
} 

給你一個預先定義的函數命名getrand100()(以上)的 返回一個整數,這是一個從1-100的隨機數。您可以根據需要多次撥打 此功能,但請注意,此功能 相當耗費資源。您不能使用任何其他隨機 生成器。您不能更改getrand100()的定義。

輸出:以隨機順序打印1-20號碼。 (不是20個隨機數)

我已經試過..

public class MyClass { 

    static Random r = new Random(); 
    static HashSet<Integer>; 

    public static void main(String args[]) { 
     myMethod(); 
     System.out.println(s); 
    }  

    public static void myMethod() { 
     boolean b = false; 
     s = new HashSet<Integer>(); 
     int i = getRand100(); 
     if (i >= 20) 
      i = i % 20; 
     int j = 0; 

     int k, l; 
     while (s.size() <= 20) 
     { 
      System.out.println("occurence no" + ++j); 
      System.out.println("occurence value" + i); 
      b = s.add(i); 
      while (!b) { 
       k = ++i; 
       if(k<=20) 
        b = s.add(k); 
       if(b==true) 
        break; 
       if (!b) { 
        l = --i; 
        if(i>=1&&i<=20) 
         b = s.add(l); 
        if(b==true) 
         break; 
       } 
      } 
     } 
     System.out.println(s); 
    } 

    public static int getRand100() 
    { 
     return r.nextInt(100) + 1; 
    } 
} 

感謝您的幫助!

+1

-1 http://www.emilvikstrom.se/whyidownvote.html(你有什麼嘗試?) –

+0

你是說,如果你得到一個數字x使得x == 0或x> 20,你有拒絕它? – Makoto

+0

yes just ...... –

回答

2

我相信你問的是如何使用隨機數發生器以隨機順序打印出數字1到20。這也被稱爲「隨機排列」。 Fischer-Yates shuffle就是這樣一種算法。但是,要實現該算法,首先需要一個隨機數生成器,它可以從N個項目中選擇一個,其概率爲N,其中N的範圍從2到該組的大小,以便洗牌,而只有一個可以以相同的概率從100個項目中選出一個項目。這可以通過模算術和「再滾動」的組合來輕鬆獲得。

+0

也許他只需要一個數值爲1到20的數組,然後使用他所具有的隨機函數應用Fishcer-Yates shuffle算法。爲了利用這個shuffle函數的時間,數組可以有1到20個元素(我想)。 –

1

假設你可以使用ArrayList類,我建議用你想要的數字填充一個列表(在這種情況下是1到20),然後隨機從列表中選擇數字並將其刪除。使用getRand100() % theList.size()應該足夠隨機爲您的原因,你只需要調用它19次。當只剩下一個元素時,不需要「隨機」從列表中選擇它。 ;-)

+0

我認爲這可能與@Weeble在其他答案中提出的Fisher-Yates shuffle相同。從來不知道這實際上有一個「官方」的名字,因爲我很早以前就已經提出了它的名字,並且從來沒有打擾過查看它,因爲我發現它很「明顯」。 – Wormbo

0

我相信我已經想出了一種方法來轉換1和n之間的任何數字! (假設項目的數量已知)到n個項目的唯一排列。

實質上,這允許對整個卡組進行「即時」隨機化,而無需使用任何洗牌算法。目前,它運行在O(n^2)並且需要使用BigInteger軟件包(即Java或Javascript),但我正在尋找優化運行時的方法(儘管如此,老實說,2500次迭代現在無論如何都不算​​什麼)。無論如何,當給定至少226比特的有效隨機數據時,該函數能夠在10毫秒內生成52個整數的混洗陣列。

該方法類似於用於將十進制數轉換爲二進制數(連續除以2等)的方法。我很樂意根據要求提供我的代碼;我覺得有趣的是我之前沒有遇到過它。