[英]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.