[英]Java Create a a Randomized ArrayList<Integer> that utilizes another ArrayList's numbers
我一直在解決這個問題。
我需要編寫一個程序,以產生數字1到10的隨機排列。
我解決這個問題的策略是:
要生成隨機排列,您需要用數字1到10填充ArrayList,以便該數組的兩個條目都不具有相同的內容。 我想避免調用Random.nextInt()。 而是通過制作第二個ArrayList並用數字1到10填充它來實現更智能的方法。然后隨機選擇其中一個, 將其刪除 ,然后將其附加到置換ArrayList中。 重復十次。
我基本上是這樣的:
import java.util.ArrayList;
import java.util.Random;
public class P4_Icel_Murad_Permutations
{
public static void main(String[] args){
ArrayList <Integer> myArrayList = new ArrayList <Integer> ();
P4_Icel_Murad_Permutations obj = new P4_Icel_Murad_Permutations();
obj.perma(10,1,10);
}
static java.lang.Object[] perma(int n, int a, int b){
ArrayList <Integer> myArrayList = new ArrayList <Integer> ();
ArrayList <Integer> randomized = new ArrayList <Integer> ();
randomized.add(new Integer(1));
randomized.add(new Integer(2));
randomized.add(new Integer(3));
randomized.add(new Integer(4));
randomized.add(new Integer(5));
randomized.add(new Integer(6));
randomized.add(new Integer(7));
randomized.add(new Integer(8));
randomized.add(new Integer(9));
randomized.add(new Integer(10));
for(Integer N: randomized){
Random r = new Random();
randomized.remove(r);
myArrayList.add(N);
}
}
}
我的問題是我不太確定如何通過刪除數字並將其添加到myArrayList來從其他列表中獲取。 我似乎無法使用r,因為它是原始類型,而且我不知道如何為隨機類創建對象。
提前致謝!
我認為您的開端很好。 但是,我認為一個更好的解決方案可能是:
首先,制作一個空的ArrayList來存儲已經生成的值。 在for循環內,生成一個隨機數,檢查以確保indexOf
返回-1(這意味着它在數組內不存在),如果存在,則追加到數組,如果不存在,則再次生成,直到返回-1。
如果要使用現有方法,則要生成一個介於0到9之間的整數(可以使用Random的nextInt()
方法)來創建索引。
因此,它看起來像:
for(Integer N: randomized){
Random r = new Random();
//insert nextInt generator here, store it in a variable (i'm going to use j)
myArrayList.add(randomized.remove(j));
}
您可以做的就是使用Collections.shuffle()
來對ArrayList
進行洗牌。
ArrayList <Integer> randomized = new ArrayList <Integer> ();
randomized.add(new Integer(1));
randomized.add(new Integer(2));
randomized.add(new Integer(3));
randomized.add(new Integer(4));
randomized.add(new Integer(5));
randomized.add(new Integer(6));
randomized.add(new Integer(7));
randomized.add(new Integer(8));
randomized.add(new Integer(9));
randomized.add(new Integer(10));
Collections.shuffle(randomized);
System.out.println(randomized);
這樣可以避免使用單獨的arrayList
以及獲得隨機數並刪除該特定索引的邏輯。 換句話說, 最佳
您的代碼的問題在於,生成的隨機數必須在0
到size - 1
的范圍內,您不會在意。
Random rand = new Random();
while(randomized.size() != 0)
{
int randomNum = rand.nextInt(randomized.size());//produces a number within the range.
myArrayList.add(randomized.get(randomNum));
randomized.remove(randomNum);
}
System.out.println("List 1: " + randomized);
System.out.println("List 2: " + myArrayList);
改組是一個令人驚訝的難題,因為有很多方法可以將其弄錯,但是如果您不注意,錯誤的方法看起來很像正確的方法。
此類問題的規范答案是Knuth / Fischer-Yates shuffle ,這是Collections.shuffle()
所做的。 查閱Wikipedia上的文章:它非常全面。
在實施自己的改組時,請確保您閱讀了Jeff Atwood的《奈特維特的危險》,其中解釋了為什么僅對隨機數進行“排序” 並不是正確的改組 ,並查看Eric Lippert的有關隨機性的博文,該博文還提供了許多有用的背景知識。簡單易懂的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.