簡體   English   中英

使用隨機數生成器的整數隨機排列

[英]Random permutation of integers using a random number generator

這是我的家庭作業:

 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 到 20。 這也稱為“隨機排列”。 Fischer-Yates shuffle就是這樣一種算法。

但是,要實現該算法,您首先需要一個隨機數生成器,它可以以相等的概率從 N 個項目中選擇一個,其中 N 的范圍從 2 到要洗牌的集合的大小,而您只有一個可以選擇100 個項目中的一個概率相等。 這可以通過模運算和“重新滾動”的組合輕松獲得。

假設您可以使用ArrayList類,我建議您用您想要的數字(在本例中為 1 到 20)填充一個列表,然后從列表中隨機選擇數字並將其刪除。 使用getRand100() % theList.size()應該對您的原因足夠隨機,您只需要調用它 19 次。 當只剩下一個元素時,就不再需要從列表中“隨機”選擇它了。 ;-)

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

本質上,這允許對整個牌組進行“立即”隨機化,而無需使用任何洗牌算法。 目前,它在 O(n^2) 中運行並需要使用 BigInteger 包(即在 Java 或 Javascript 中),但我正在尋找優化運行時的方法(盡管說實話,現在 2500 次迭代算不了什么)。 無論如何,當給定至少 226 位有效的隨機數據時,該函數能夠在 10 毫秒內生成一個包含 52 個整數的混洗數組。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM