【问题标题】:Array shuffling not working阵列改组不起作用
【发布时间】:2011-09-09 14:00:36
【问题描述】:

我正在尝试编写代码以在不使用集合的情况下对数组进行洗牌。

我的洗牌码

金额

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);
            }
        }
    }

我的问题是他们没有被随机化,有人知道为什么吗?

【问题讨论】:

  • 尝试使用i &lt; amounts.length 而不是&gt;

标签: java arrays algorithm random shuffle


【解决方案1】:

你的第一个 sn-p 中的 for 循环似乎是错误的

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

不应该

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

【讨论】:

    【解决方案2】:

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

    自己手动滚动似乎没有必要

    【讨论】:

    • 是的,很明显。除非他将其作为练习/家庭作业或只是为了学习 Java?
    • 另外,洗牌实际上是一个相当困难的问题,非常容易出错。是的,使用Collection.shuffle 就可以了。
    • @Andrew:您可能想在问题中提及这一点。
    • @Andrew:Random 也是 API 的一部分。
    【解决方案3】:

    我的建议是反向开始洗牌:

    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 上是均匀的,这将对您的数组进行洗牌,每个排列的可能性相同。对此的论证是直截了当的。

    【讨论】:

      【解决方案4】:

      除了你的for循环有问题,你应该改变

      rgen.nextInt(amounts.length)
      

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

      获得均匀的随机分布。

      【讨论】:

        猜你喜欢
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 2017-04-19
        • 2017-09-16
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多