没有数组的Java随机数生成器

时间:2018-11-07 19:47:57

标签: java random duplicates

我对Java完全陌生,正在从事一项作业。我需要生成1-49范围内的6个随机数,这很简单。 但是,复杂的是数字不能重复。 我对条件的唯一选择是while循环或if else语句。 数组和所有其他循环均超出此分配范围。 真的可以就物流如何使用我所拥有的选择使用一些建议。我意识到没有数组,而其他循环将有很多重复的代码,但可以处理。我只需要一些帮助就可以解决这个问题。

5 个答案:

答案 0 :(得分:4)

如果您不能使用数组或其他集合,则可以创建6个变量来保存生成数字。

public class Generate6Number {

public static void main(String[] args) {
    int num1 = 0;
    int num2 = 0;
    int num3 = 0;
    int num4 = 0;
    int num5 = 0;
    int num6 = 0;

    int count = 0;

    while (count < 6) {
        int numGen = (int) (Math.random() * 49);

        if (numGen != num1 &&
            numGen != num2 &&
            numGen != num3 &&
            numGen != num4 &&
            numGen != num5) {
            if (num1 == 0)
                num1 = numGen;
            else if (num2 == 0)
                num2 = numGen;
            else if (num3 == 0)
                num3 = numGen;
            else if (num4 == 0)
                num4 = numGen;
            else if (num5 == 0)
                num5 = numGen;
            else 
                num6 = numGen;

            count++;
        }
    }   

    System.out.println("Number 1: " + num1);
    System.out.println("Number 2: " + num2);
    System.out.println("Number 3: " + num3);
    System.out.println("Number 4: " + num4);
    System.out.println("Number 5: " + num5);
    System.out.println("Number 6: " + num6);

}

}

答案 1 :(得分:0)

Set<Integer> values = new HashSet<>();
Random rand = new Random();

while (values.size() <= 6) {
    int  n = rand.nextInt(50) + 1;
    values.add(n);
}
System.out.println(values);

答案 2 :(得分:0)

就像洗牌一样前6张

public void shuffle() {
    int[] array = new int[49];
    for (int i = 0; i < array.length; i++) {
        array[i] = i + 1;
    }

    // we need first 6 random cards
    for (int i = 0; i < 6; i++) {
        int index = (int) (Math.random() * (( array.length - i) + 1));
        int temp = array[i];
        array[i] = array[index];
        array[index] = temp;
    }

    for (int i = 0; i < 6; i++) {
        System.out.print("[" + array[i] + "]");
    }
    System.out.println();
}

答案 3 :(得分:0)

尝试不使用数组似乎是很奇怪的练习。有可能,但是我认为这对学习Java没有特别的指导意义,因为它更多的是数学练习,而不是编程练习。

为了生成1-49范围内的6个不同的随机数,基本上,您必须为这49个数字中的每个数字决定是否“拾取”该数字,但要限制您只能选择6个数字。因此,您正在寻找一种choose(49, 6)可能的组合。

因此,您可以这样做:

int numToPick = 6;
for (int i = 1; i <= 49; ++i) {
  if (shouldPick(i, numToPick)) {
    System.out.println(i);
    --numToPick;
  }
}

(我使用了for循环;但是只要您能使用的话,就可以始终将for循环重写为while循环)。

问题在于如何实现该shouldPick函数:它返回一个布尔值true,表示您应该选择它并打印出来;或为false表示您不会。

这将是一个概率函数(即  它会使用随机数生成器),否则每次都不会给您不同的数字集。

算出该函数形式的数学很有趣,最终实现却是微不足道的。但是如果我在这里给出答案,那就不好玩了。

(但是我可以向您保证我已经实现了它,只是在上面的代码片段中只更改了一行;如果您算是声明一个随机数生成器,则只需更改2行。)

答案 4 :(得分:0)

您实际上需要排除已经选择的可能性:

Random rand = new Random();
int first = rand.nextInt(49) + 1;
int second = rand.nextInt(48) + 1;
int third = rand.nextInt(47) + 1;
int fourth = rand.nextInt(46) + 1;
int fifth = rand.nextInt(45) + 1;
int sixth = rand.nextInt(44) + 1;

if (first <= second) second++;
if (first <= third) third++;
if (first <= fourth) fourth++;
if (first <= fifth) fifth++;
if (first < sixth) sixth++;

if (second <= third) third++;
if (second <= fourth) fourth++;
if (second <= fifth) fifth++;
if (second <= sixth) sixth++;

if (third <= fourth) fourth++;
if (third <= fifth) fifth++;
if (third <= sixth) sixth++;

if (fourth <= fifth) fifth++;
if (fourth <= sixth) sixth++;

if (fifth <= sixth) sixth++;