簡體   English   中英

Java創建一個隨機的ArrayList <Integer> 利用另一個ArrayList的數字

[英]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以及獲得隨機數並刪除該特定索引的邏輯。 換句話說, 最佳


您的代碼的問題在於,生成的隨機數必須在0size - 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.

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