2013-09-24 122 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