2013-09-24 118 views
1

我在做什麼是拿我的數組硬幣[]。基本上重新排列每個硬幣到不同的位置。這是我迄今爲止。當我這樣做時,沒有任何反應。意味着所有的值保持不變。除了最後一個。那個改變了。隨機「搖動」一個數組來分配新的隨機點

public void shake() 
{ 
    for (int i = 0; i < coins.length; i++) 
    { 
     int index = Coin.RANDOM.nextInt(coins.length); 
     Coin temp = coins[index]; 
     coins[index] = coins[i]; 
     coins[i] = temp; 

     System.out.print(coins[i] + ", "); 
    } 
} 

我實例隨機這樣的:

public static long SEED = System.currentTimeMillis(); 
public static Random RANDOM = new Random(SEED); 
+0

您可以發佈輸入示例及其提供的輸出。最好多次嘗試 – Cruncher

+0

你如何實例化'Coin.RANDOM'? – AxiomaticNexus

+0

即使這種方式按照你想要的方式工作,是不是隻是隨着前11個項目洗牌?它應該是.nextInt(coins.length)? – jlarson

回答

1

當你使用掉期指數與你將交換當前值,您可以編輯您的隨機數生成器生成一定範圍之間的隨機數(比如0 - coins.length),然後你可以改變你的實現是這樣的

public void shake() 
{ 

    Coin temp; 

    for (int i = 0; i < coins.length; i++) 
    { 
     //int swap = Coin.RANDOM.nextInt(coins.length); 
     temp = coins[swap]; 
     coins[swap] = coins[i]; 
     coins[i] = temp; 

     System.out.print(coins[i] + ", "); 
    } 
} 

對於代碼中的註釋行檢查THIS來更新您的隨機數生成器以生成兩個值之間的數字。然後每次在i+1 - coins.length之間生成交換(索引)並繼續執行,直到完全耗盡陣列。這可以確保您不會在索引處交換您已經顯示的值。但我並不完全相信這確實是一個隨機洗牌,因爲在循環開始時,您有更多的交換指數選擇,那麼您在循環中稍後會有一些時間,並且這種搖動不是完全隨機的。這種解決方案只有在你想嚴格執行你自己的搖動方法而不使用@Tomek提到的Collections.shuffle

+0

collections.shuffle的問題是我以前從未使用它。我從未見過它。當我嘗試添加i + 1 - coins.length。我得到一個例外,說n必須是正面的? –

+0

我的意思是'我+ 1'到'coins.length'不減去兩個:) – Prateek

+0

噢,我的壞,那它是如何出現了我的屏幕下一行上。哈哈。但是現在是它的工作。非常感謝!! –

2

請注意,這條線

System.out.print(coins[swap] + ", "); 

顯示已經移動(交換)的硬幣。也許你想在i指數顯示新硬幣coins[i](這是不正確的,無論如何,作爲已經顯示硬幣仍然可以在未來的迭代中交換)。最好創建第二個for循環來顯示最終的硬幣值。

但這不僅是問題在這裏。要隨機洗牌數組,您應該使用Fisher-Yates算法,這與您的方法略有不同。您可以在SO上找到此算法的Java實現。

如果你有一個List<Coin>而不是Coin[](列表而不是數組),你可以使用Collections.shuffle方法,並確保算法是正確的,你總是會得到隨機結果。

+0

好吧,我改變了我的代表說,現在唯一的問題是我有硬幣重複自己。 –

+0

+1洗牌提示;-) –

+0

如果你有一個數組,你只需要鍵入一些更多的字符:Collections.shuffle(Arrays.asList(硬幣)) – lbalazscs

0

您可以使用Knuth的其重新排列陣列,這樣的結果是均勻隨機排列洗牌算法。算法是簡單的,但就像一個魅力:

  1. 遍歷陣列和迭代挑隨機整數swap交換之間
  2. 陣列[I]陣列[交換]

注意,在您的實現隨機爲0至11,這似乎並沒有產生良好的洗牌之間產生。

這裏是洗牌的整數數組代碼示例:

import java.util.Random; 

public class Test { 

public static long SEED = System.currentTimeMillis(); 
public static Random RANDOM = new Random(SEED); 

public static void shuffle(int[] numbers) 
{ 
    for (int i = 0; i < numbers.length; i++) 
    { 
     int swap = RANDOM.nextInt(i + 1); 
     int temp = numbers[swap]; 
     numbers[swap] = numbers[i]; 
     numbers[i] = temp; 
    } 

    for (int i = 0; i < numbers.length; i++) { 
     System.out.print(numbers[i] + ", "); 
    } 
} 

public static void main(String[] args) { 
    shuffle(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}); 
} 

}

輸出的試運行是:

5, 11, 6, 1, 3, 10, 9, 2, 4, 7, 8, 
+0

我不知道爲什麼這有所作爲。但我只是將我的印刷聲明移到了一個單獨的循環中。現在它應該像現在這樣...我也把i + 1放在那裏。 –

0

你爲什麼不使用類別?它很容易爲數組或ArrayList中的每個值分配隨機索引。

Collections.shuffle(coins);//if coins is array 
Collections.shuffle(Arrays.asList(coins));//if coins is an ArrayList