在表/ java上重复绘制六个随机数

时间:2018-10-02 09:51:07

标签: java

你好,我反复画随机数。我尝试在表上执行此操作,但是每次在将生成的随机数与表中的数字进行比较时遇到问题。请注意此处,因为此代码现在是无限循环,会引发ArrayIndexOutOfBoundsException。你有什么想法?向您展示我想要得到的内容类似于波兰电视节目Lotto,他们正在绘制6个随机重复地写在球上的随机数。 我已经看到了在列表上完成该操作的主题,但是在这样的表上有可能吗?

public static void main(String[] args) {

    Lotto lot = new Lotto();

    int[] table = new int[6];

    Random random = new Random();

    for(int i = 0; i < 6; i++) {
        int numbers = random.nextInt(48) + 1;
        for(int k = 0; k < 6; k++) {
            if (table[k] != numbers) {
                try {
                    table[i] = numbers;
                } catch (ArrayIndexOutOfBoundsException e){
                    System.out.println(e); 
                } 
            } else {
                i--;
            }
        }
    }

    Arrays.sort(table);

    for (int m = 0; m < 6; m++) {
        System.out.println(table[m]);
    }

}

4 个答案:

答案 0 :(得分:3)

我建议采用以下方法:

    // Get list of all number
    List<Integer> all = new ArrayList<>();
    for (int i = 1; i <= 48; i++) {
        all.add(i);
    }

    //Shuffle it
    Collections.shuffle(all);

    //Take first 6
    List<Integer> result = all.subList(0, 6);

答案 1 :(得分:2)

有两种流行的技术,仅选择可用的项目或选择任何可能的项目,然后检查是否已选择。该答案从可能的号码中选择,检查是否已选择号码。如果尚未选择,则将其添加到阵列。如果已选择,则重复该过程。

SCPreferencesRef prefRef = SCPreferencesCreate(kCFAllocatorDefault, kCFPreferencesAnyUser, NULL);
CFArrayRef keys = SCPreferencesCopyKeyList(prefRef);
CFStringRef key = (__bridge CFStringRef)@"System";
CFPropertyListRef plist = SCPreferencesGetValue(prefRef, key);
NSLog(@"%@", keys);
NSLog(@"%@", plist);

技术的使用方式取决于您需要选择的样本数量与所选择的样本数量相比。

如果您需要选择1到1000000之间的任意六个数字,则此技术会更好,因为重复的几率很小,但是对一百万个元素列表进行混排需要更多的计算。

如果您的可能数字较小,例如,如果您必须在1到7之间选择6个数字,则另一种方法更为合适,那么您会选择很多重复项。因此,改组列表会更好。

在您的范围内(49个中的6个),选择和重复会更快,因为您经常会发现一个新的数字。

答案 2 :(得分:1)

我会这样:

TreeSet<Integer> t = new TreeSet<>();
while (t.size()<6) {
    t.add((int)(Math.random()*48+1));
}

TreeSet 保证仅将唯一的项目放入目标集合。

答案 3 :(得分:0)

尝试对现实世界进行建模,并让您的应用程序执行现实生活中发生的事情。您有48个球,编号为1到48。让我们收集它们:

List<Integer> ballsInTheMachine = new ArrayList<>(48);
for (int i = 1; i <= 48; i++)
    ballsInTheMachine.add(i);

使用Java 8 Streams,您还可以以一种更为简洁的方式创建同一列表:

List<Integer> ballsInTheMachine = IntStream.rangeClosed(1, 48)
        .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

接下来,您从48个中随机选择6个球:

Random rng = new Random();
List<Integer> ballsPicked = new ArrayList<>(6);
for (int i = 1; i <= 6; i++) {
    int index = rng.nextInt(ballsInTheMachine.size());
    Integer pickedBall = ballsInTheMachine.remove(index);
    ballsPicked.add(pickedBall);
}

现在您在列表ballsPicked中有6个随机选择的球。