【问题标题】:2 arrays to randomly display 1-10 and random 1-10 without function2个数组随机显示1-10和随机1-10无功能
【发布时间】:2019-03-12 20:54:37
【问题描述】:

这个程序的目标是让 A2[] 以随机顺序显示数字 1-10。它需要在没有任何基础知识的情况下完成。 A2[] 从 A1[] 中获取数字,A1[] 数组依次存储数字 1-10。程序在其当前状态下运行,但不会过滤掉已经存储在 A2[] 中的结果。例如.... 4,2,3,7,5,9,7,1,4 应该不能成为结果。应该只显示 1-10 的随机顺序,每个 int 只出现一次。任何帮助是极大的赞赏。目前代码如下:`

public class W07problem07 {

    public static int getRandomIntRange(int min, int max) {
        int x = (int) (Math.random() * ((max - min))) + min;
        return x;
    }

    public static void main(String[] args) {
        int ranNum;
        int count = 1;
        int[] A1 = new int[10];
        int[] A2 = new int[10];

        //loop for storing 1-10 int number withing  A1[].
        for (int k = 0; k < A1.length; k++) {
            A1[k] = count;
            count++;
        }
        for (int k = 0; k < A2.length; k++) {
            A2[k] = k;
        }

        for (int j = 0; j < A2.length; j++) {
            int a;
            ranNum = getRandomIntRange(0, A2.length);
            a = A2[j];
            if(a==ranNum){
                j--;
            } else{
                A2[j]= A1[ranNum];
            }
        }



        for (int k = 0; k < A2.length; k++) {
            System.out.println(A2[k]);
        }
    }
}
`

【问题讨论】:

  • 类似,但我只能使用 A1[] 和 A2[]。它是一个用于课堂的硬件,我们还没有讨论过该线程中的任何内容。
  • 由于您的源数组只有 1-10 之间的数字,您可以使用超出此范围的数字填充目标数组,例如 -1(这称为标记值)。然后,对于源数组中的每个数字,选择一个随机目标数组索引并检查它是否可用(其中包含 -1)。继续选择新索引,直到找到可用的插槽。
  • 哦!!!我没有想到这一点。我现在就试一试,看看效果如何。谢谢!

标签: java arrays random numbers numeric


【解决方案1】:

确实有很多方法可以满足您的要求。

最简单的方法之一是应用散列理论,使用下一个未调用的数字作为下一个(伪)随机数。
我假设您在代码中编写的内容没有多大意义,因此要遵循接下来的内容,我假设 A1 填充了数字 1-10,而您直接使用随机数字填充 A2。

示例:
这是您的 A2 的当前状态。下一个被选中的随机数是 1,但如果它已经被选中,那就不好了。

A1   |1 2 3 4 5 6 7 8 9 10|
A2   |1 4 7 9 . . . . . . |

因此,当发现“冲突”时,请继续应用此修复:
新的随机数变为 x = x+1,直到取一个未选取的数字。

所以

A1   |1 2 3 4 5 6 7 8 9 10|
A2   |1 4 7 9 2 . . . . . |

您可以想象有很多可以使用的冲突策略,前一种称为开放寻址。

【讨论】:

    【解决方案2】:

    另一种解决方案

    public class W07problem07 {
        public static int getRandomIntRange(int min, int max) {
            int x = (int) (Math.random() * ((max - min))) + min;
            return x;
        }
        public static void main(String[] args) {
            int count = 1;
            int[] A1 = new int[10];
            int[] A2 = new int[10];
            //loop for storing 1-10 int number withing  A1[].
            for (int k = 0; k < A1.length; k++) {
                A1[k] = count;
                count++;
            }
            int j = 0;
            while (j < A1.length) {
                int ranNum = getRandomIntRange(1, A1.length + 1);
                if (!numAlreadyExists(A2, ranNum)) {
                    A2[j++] = ranNum;
                }
            }
            for (int k = 0; k < A2.length; k++) {
                System.out.println(A2[k]);
            }
        }
        public static boolean numAlreadyExists(int[] array, int element) {
            for (int i = 0; i < array.length; i++) {
                if (element == array[i]) {
                    return true;
                }
            }
            return false;
        }
    }
    

    【讨论】:

    • 这可能会暂时输出所需的输出。但是在您的代码中,您没有使用 A1 数组。如果A1 包含例如从 11 到 20 的数字,您的解决方案仍将打印数字 1 到 10。
    猜你喜欢
    • 2018-09-14
    • 2018-11-12
    • 2016-02-09
    • 2010-11-26
    • 2011-06-09
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多