【问题标题】:Create an array with random values in a certain range创建一个具有一定范围内随机值的数组
【发布时间】:2013-12-28 17:34:22
【问题描述】:

大家!

我有一个任务是创建一个小程序来为彩票生成不同的投注。我有好几个小时想知道应该在每个赌注中创建具有不同数字的数组的代码。问题是,尽管我试图减少重复,但我的代码会不断在矩阵的每一行中生成带有重复数字的赌注。 你认为我应该更深入地观察什么?

public static void main(String[] args) {


    //Ask the user how many lines of 15 numbers will be created
    System.out.print("How many lines should the matrix have? ");
    Scanner input = new Scanner(System.in);
    int numberOfLines = input.nextInt();


    //  Create the two-dimension array.
    int[][] numbers = new int[15][numberOfLines];
    for (int i = 0; i < numberOfLines; i++) {
        for (int j = 0; j < 15; j++) {
            boolean exist = false;
            do {
                numbers[j][i] = 1 + (int)(Math.random()*25);
                for (int k = 0; k < j; k++) {
                    if (numbers[j][i] == numbers[k][i])
                        exist = true;
                    else {
                        exist = false;
                    }
                }               
            } while (exist);
        }
    }

    //Sort the array
    int temp = 0;
    for (int i = 0; i < numberOfLines; i++){
        for (int j = 0; j < 15; j++) {
            for (int k = (j + 1); k < 15; k++)
                if (numbers[k][i] > numbers[j][i]) {
                    temp = numbers[j][i];
                    numbers[j][i] = numbers[k][i];
                    numbers[k][i] =  temp;
                }
        }
    }


    //Print the array
    System.out.println();
    for(int i = 0; i < numberOfLines; i++) {
        System.out.printf("Line %d:  ", (i+1));
        for (int j = 0; j < 15; j++){
            System.out.printf("%4d",numbers[j][i]);
        }
        System.out.println();
        System.out.println();

    }
    //System.out.println(numbers[0][1]);
    //System.out.println(numbers[1][0]);
}

}

【问题讨论】:

    标签: java arrays random


    【解决方案1】:

    如果您的主要问题是从一个较大的集合中选择一组没有重复的数字,这里有一个简单的示例类可以做到这一点。每次调用 sample 时,列表都会被打乱并返回第一个 n 项。

    import java.util.List;
    import java.util.ArrayList;
    import java.util.Collections;
    
    class Lotto {
        private List<Integer> nums = new ArrayList<Integer>();
    
        // constructor
        public Lotto(int m) {
            // add m numbers to list
            for (int i=1; i <= m; ++i)
                nums.add(i);
        }
    
        public List<Integer> sample(int n) {
            // Randomly samples n integers from 1 to m without duplicates
            Collections.shuffle(nums);
            return nums.subList(0, 6);
        }
    }
    

    这是DrJava's交互选项卡中使用的类的示例:

    > Lotto from40 = new Lotto(40)
    > from40.sample(6)
    [37, 2, 24, 30, 19, 29]
    > from40.sample(6)
    [17, 8, 16, 25, 33, 39]
    

    【讨论】:

      【解决方案2】:

      做这样的事情怎么样:

      int[] createRanomArray(int size, int lowBound, int highBound) {
          Random random = new Random();
      
          Set<Integer> randomsSet = new HashSet<Integer>(size);
      
          while (randomsSet.size() < size) {
              randomsSet.add(lowBound + random.nextInt(highBound - lowBound));
          }
      
          List<Integer> asList = new ArrayList<Integer>(randomsSet);
          Collections.shuffle(asList);
      
          int[] result = new int[size];
          for (int i = 0; i < size; i++) {
              result[i] = asList.get(i);
          }
          return result;
      }
      

      现在asList 列表包含一组随机值,​​现在只需将每个值分配给矩阵中列的一个单元格。

      Set 不接受重复值,这样可以确保不会出现重复结果,shuffle 使项目不按哈希码顺序排列。

      【讨论】:

        猜你喜欢
        • 2016-07-24
        • 2018-10-31
        • 1970-01-01
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 2013-10-05
        • 1970-01-01
        相关资源
        最近更新 更多