如何创建一个没有重复的随机数列表?

时间:2016-12-17 22:14:11

标签: java random

我需要创建随机数字,这些数字将通过一个没有重复的数组运行。

问题在于重复,我无法使用除Scanner之外的任何工具包(教师指示),例如java.util.Randomjava.util.ArrayList

我使用了一个名为random的函数,我的老师写信给我们,函数newNum(int num)就是我需要的东西 - 随机数。

package exercise;

import java.util.Scanner;

public class Bingo {

    static int size = 10;
    static int num;
    static int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    private static Scanner sc;

    public static void main(String[] args) {

        System.out.print("Press Enter to start: ");
        sc = new Scanner(System.in);
        sc.nextLine();
        System.out.println("");

        // int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        // int[] tempArray = arr;

        int num = random();
        // int num = sc.nextInt();

        // System.out.println(num);

        while (size > 0) {
            System.out.println(num);
            size--;
            newArray(num);
            num = random();
            newNum(num);
            // System.out.println(num);
        }

    }

    public static int random() {

        int max = 10;
        double r = Math.random();
        int num = (int) (r * max + 1);

        return num;
    }

    public static int newNum(int num) {

        // Here should go the code for the function for getting only new 
        // random  number without duplications

        return num;
    }

    public static int newArray(int num) {

        int[] tempArray = arr;

        arr = new int[size];

        int x = num - 1;
        for (int i = 0; i < x; i++) {
            if (i < size) {
                arr[i] = tempArray[i];
            }
        }
        for (int i = num; i < size; i++) {
            if (i < size) {
                int y = i - 1;
                arr[y] = tempArray[i];
            } else {
                int a = size - 1;
                arr[a] = tempArray[size];
            }
        }
        return num;
    }

}

1 个答案:

答案 0 :(得分:0)

首先,你写道你不能使用shuffle,但这并不意味着你被禁止实现它。实际上并不那么难。

如果你想这样做,请使用维基百科上的Fisher-Yates shuffle:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

(顺便说一句,既然你要上学,如果你发现这样的维基百科文章 - 或任何其他文章 - 有趣,你可以建议你的老师拿一篇文章,轻松获得额外的好成绩)

当然,这假设您有一个矢量来进行随机播放,这对于大型矢量来说是低效的(&#34; 0到10亿之间的随机数&#34;)。在这种情况下,您可能希望使用:

在0..m

中找到n个随机数
 1. Initialize an empty list of already used random numbers which is ordered, called "numbers"
 2. for i = 0..n-1
      2a: r = random(0..m-i) (uniform distribution)
      2b: for every entry in numbers
          if entry <= r, r++
      2c: sort r into numbers (maybe by using a single bubblesort step)

这将复杂性从之前的矢量大小转移到生成数量的数量。

说明:在每次迭代中,我们都想找到一个未使用的数字。我们找到了未使用的数字(迭代i中有一个0..m-i未使用数字的范围)。现在我们只需要找出哪个号码是未使用的号码。这是通过内部迭代完成的。由于这个例子,我们需要对数字进行排序:当前状态:数字= {5,1},r = 4. r&lt; 5 - &gt;没做什么。 r> = 1 - &gt; [R ++。以r = 5结束,得到了双重录入。

如果不希望对结果列表进行排序,只需使用两个列表。