2011-09-09 108 views
3

我想编写代码来洗牌数组而不使用集合。阵列洗牌不工作

我的洗牌代码

private double amounts[] = { 0, 0.01, 1000000, 25, 250000, 75, 50, 1000, 
      200, 100, 400000, 750, 5000, 750000, 500, 100000, 300, 75000, 800, 
      20, 300000, 10, 50, 750, 25, 5, 1 }; 

public void Shuffle(){ 

     Random rgen = new Random(); 
     for (int i=0; i > amounts.length; i++) { 
      int randomPosition = rgen.nextInt(amounts.length); 
      double temp = amounts[i]; 
      amounts[i] = amounts[randomPosition]; 
      amounts[randomPosition] = temp; 
    } 
    } 

在这里启动它

public void casesSetup() { 

     for (int i = 0; i < briefcase.length; i++) { 

      if (i == 0) { 

      } else { 
       briefcase[i] = new Briefcase(); 
       double value = amounts[i]; 
       briefcase[i].setAmount(value); 
       briefcase[i].setFace(i); 
      } 
     } 
    } 

我的问题是,他们没有被随机任何人有一个想法,为什么代码?

+0

试着做'我<的amount.length'而不是'> – Juan

回答

1

我的尖端是开始洗牌反向:

Random rgen = new Random(); 
for (int i = amounts.length - 1; i > 0; --i) { 
    int randomPosition = rgen.nextInt(i + 1); 
    double temp = amounts[i]; 
    amounts[i] = amounts[randomPosition]; 
    amounts[randomPosition] = temp; 
} 

假设的Random.nextInt(N)的分布是关于0..N-1,这将随机播放阵列每个置换同等均匀尽可能。对此的论证很直接。

5

在你的第一个片段循环似乎是错误的

for (int i=0; i > amounts.length; i++) { 

应该不会是

for (int i=0; i < amounts.length; i++) { 
3

存放在列表中的值,并使用 Collections.shuffle http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#shuffle(java.util.List

自己动手这个看起来不需要

+0

是的,显然。除非他是作为一种实践/作业或简单地学习Java? –

+0

另外,洗牌实际上是一个相当困难的问题,很容易出错。是的,使用'Collection.shuffle'并完成它。 – Bombe

+1

我已经知道了,我现在不使用API​​S –

0

除了你的循环是错误的,你应该改变

rgen.nextInt(amounts.length) 

rgen.nextInt(amounts.length - i) + i 

得到均匀随机分布。