【问题标题】:Trying to get non-repeating random numbers with arrays尝试使用数组获取非重复随机数
【发布时间】:2019-12-03 02:49:19
【问题描述】:

我通过包含一个数组重新尝试了我之前的问题。该程序没有错误,但数字仍然重复。这是我的代码:

public static String ball() {
        String var = null;
        int ranVar[] = new int[75];
        final Random ran = new Random();
        int temp;

        for (int i = 0; i < ranVar.length; i++) {
            do {
                temp = ran.nextInt(74) + 1;
            } while (match(temp, ranVar));
            ranVar[i] = temp;
            if (ranVar[i] <= 15) {
                return var = "B" + ranVar[i];
            } else if (ranVar[i] <= 30) {
                return var = "I" + ranVar[i];
            } else if (ranVar[i] <= 45) {
                return var = "N" + ranVar[i];
            } else if (ranVar[i] <= 60) {
                return var = "G" + ranVar[i];
            } else if (ranVar[i] <= 75) {
                return var = "O" + ranVar[i];
            }

        }

        return null;
    }

    private static boolean match(int temp, int var[]) {
        for (int i = 0; i < var.length; i++) {
            if (temp == var[i]) {
                return true;
            }
        }
        return false;
    }

感谢您的帮助。

【问题讨论】:

  • 看起来正确并生成不同的组合。但是,如果您的意图是使用随机变量运行 75 次,则不要循环返回。填充数组后返回数组
  • 这能回答你的问题吗? Random shuffling of an array

标签: java arrays random repeat


【解决方案1】:

内嵌评论


    // Seed your random number generator
    final static Random ran = new Random(System.currentTimeMillis());

    // create a set to store previously generated random numbers
    static Set<Integer> usedIntegers = new HashSet<>();

    // generate numbers until a number is found which is not been selected
    public static int nextAvailableRandomInteger(){
        int temp;
        do{
            temp = ran.nextInt(74) + 1;
        } while (usedIntegers.contains(temp));
        usedIntegers.add(temp);
        return temp;
    }


    // I have no idea what this method does. So I changed the random number generator part.
    public static String ball() {
        String var = null;
        int ranVar[] = new int[75];

        int temp;

        for (int i = 0; i < ranVar.length; i++) {
            do {
                temp = nextAvailableRandomInteger();
            } while (match(temp, ranVar));
            ranVar[i] = temp;
            if (ranVar[i] <= 15) {
                return var = "B" + ranVar[i];
            } else if (ranVar[i] <= 30) {
                return var = "I" + ranVar[i];
            } else if (ranVar[i] <= 45) {
                return var = "N" + ranVar[i];
            } else if (ranVar[i] <= 60) {
                return var = "G" + ranVar[i];
            } else if (ranVar[i] <= 75) {
                return var = "O" + ranVar[i];
            }

        }

        return null;
    }

    private static boolean match(int temp, int var[]) {
        for (int i = 0; i < var.length; i++) {
            if (temp == var[i]) {
                return true;
            }
        }
        return false;
    }

    // I have no idea what this method does. So I changed the random number generator part.
    public static String ball() {       
        String var = null;
        int ranVar[] = new int[75];

        int temp;

        for (int i = 0; i < ranVar.length; i++) {
            do {
                temp = nextAvailableRandomInteger();
            } while (match(temp, ranVar));
            ranVar[i] = temp;
            if (ranVar[i] <= 15) {
                return var = "B" + ranVar[i];
            } else if (ranVar[i] <= 30) {
                return var = "I" + ranVar[i];
            } else if (ranVar[i] <= 45) {
                return var = "N" + ranVar[i];
            } else if (ranVar[i] <= 60) {
                return var = "G" + ranVar[i];
            } else if (ranVar[i] <= 75) {
                return var = "O" + ranVar[i];
            }

        }

        return null;
    }

    private static boolean match(int temp, int var[]) {
        for (int i = 0; i < var.length; i++) {
            if (temp == var[i]) {
                return true;
            }
        }
        return false;
    }

PS:这不是最好的方法。最终,该集合将填满 75 个数字,并且无法退出循环,程序将无限期地运行。改善这一点的一种方法是生成一个数字列表,然后从该列表中选择,删除使用过的数字,这样当你到达一个空列表时,游戏就会停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 2018-10-22
    相关资源
    最近更新 更多