0

我有 2 个类,LotSelection并且LotGen,在一个名为lotterynumberselector. LotSelection有 2 种方法:LotPool()WinningSequence(). LotPool()旨在返回从 0 到 49 的 50 个整数的 ArrayList 并将其打乱。WinningSequence()旨在创建一个 6 元素数组,其中包含 LotPool() 中生成的 ArrayList 中的前 6 个整数。

这是 的代码LotSelection

package lotterynumberselector;

import java.util.ArrayList;
import java.util.Collections;

public class LotSelection {

ArrayList<Integer> LotPool() {
    ArrayList<Integer> sequencedraw = new ArrayList<Integer>();
    for(int i = 0; i < 49; i++) {
          sequencedraw.add(i);
    }
    Collections.shuffle(sequencedraw);
    return sequencedraw;
}

int[] WinningSequence() {
    int[] WinningSequence = new int[6];
    int j = 0;
    while (j < 6) {
        WinningSequence[j] = LotPool().get(j);
        j++;
    }
    return WinningSequence;
}

}

的目的LotGen是测试由创建的输出是否LotSelection完成了预期的任务。但是,WinningSequence() 的输出与 LotPool() 创建的前六个数字不匹配,我想知道为什么。我不确定是否是因为代码中的LotGenLotSelection正在创建意外结果。我怀疑这是因为LotPool()正在生成一个 50 元素的 ArrayList 并且WinningSequence()正在创建另一个,LotPool()所以它是从不同的 50 元素 ArrayList 中创建的数组,但我不确定。

这是代码LotGen

package lotterynumberselector;

import java.util.ArrayList;
import java.util.Arrays;

public class LotGen {

public static void main(String [] args) {

    LotSelection a = new LotSelection();
    ArrayList<Integer> LotPool = new ArrayList<Integer>();
    LotPool = a.LotPool();
    System.out.println(LotPool);

    int[] WinSeq = new int[6];
    WinSeq = a.WinningSequence();
    System.out.println(Arrays.toString(WinSeq));

}

}
4

4 回答 4

1

在您的获胜序列方法中,您调用 LotPool() 方法。LotPool 每次都会创建一个新的 ArrayList。

我会重构您的代码以在构造函数中初始化 50 个整数,并且不再这样做。使 LotPool() 成为返回数组列表的简单 getter 方法。

于 2013-08-19T00:53:13.290 回答
0

Collections.shuffle每次调用时,单参数版本都会产生不同的随机序列。为了获得可重复的结果,您需要传入自己的随机生成器,并适当地处理播种。

你可以这样做,但正如其他海报所指出的那样,这仍然是非常低效的。

public class LotSelection {

ArrayList<Integer> LotPool(long seed) {
    ArrayList<Integer> sequencedraw = new ArrayList<Integer>();
    for(int i = 0; i < 49; i++) {
          sequencedraw.add(i);
    }
    Collections.shuffle(sequencedraw, new Random(seed));
    return sequencedraw;
}

int[] WinningSequence(long seed) {
    int[] WinningSequence = new int[6];
    int j = 0;
    while (j < 6) {
        WinningSequence[j] = LotPool(seed).get(j);
        j++;
    }
    return WinningSequence;
}

}
于 2013-08-19T00:52:41.190 回答
0

这样做的原因很简单:每次您为返回的列表选择一个新号码时WinningSequence,您都会再次调用LotPool。您需要调用一次,将结果存储在一个变量中,并在每次循环中再次使用它。

于 2013-08-19T00:53:15.660 回答
0

这是您的 WinningSequence 方法中的问题:

    WinningSequence[j] = LotPool().get(j);

每次添加到阵列时,您都会获得列表。这将导致仅获取列表的第一个元素。您只需要在循环之外执行此操作一次。

以下是更新 WinningSequence 方法的方法:

int[] WinningSequence() {
    int[] WinningSequence = new int[6];
    int j = 0;
    ArrayList<Integer> LotPool = LotPool().get(j)
    while (j < 6) {
        WinningSequence[j] = LotPool .get(j);
        j++;
    }
    return WinningSequence;
}
于 2013-08-19T00:53:56.113 回答