【问题标题】:don't random number that are being random before不要随机数之前是随机的
【发布时间】:2014-08-03 05:17:44
【问题描述】:

我知道如何使用 java Random 类随机数。

这将随机一个 0-13 之间的数字 13 次;

 public static void main(String[] args) {
    int ctr = 13; 
    int randomNum = 0;
    while(ctr != 0) {
        Random r = new Random();
        randomNum = r.nextInt(13);
        ctr--;
        System.out.println(ctr +": " + randomNum);
    }
 }

问题

-我想随机取一个 0-13 之间的数字 13 次

-如果第一个随机数是例如(5),那么我的第二个随机数将再次随机从0-13中的任何数字排除5

如果第二个随机数是 e.g(4),那么我的第三个随机数将再次随机从 0-13 中的任何数字 不包括 5 和 4; ETC.. 有什么办法吗?

【问题讨论】:

标签: java random


【解决方案1】:

这样做:

  • 创建大小为 13 的 List
  • 用数字 0-12 填充它
  • 使用 JDK Collections 实用方法随机播放列表
  • 按打乱顺序使用数字(只需遍历列表)

在代码中:

List<Integer> nums = new ArrayList<Integer>();
for (int i = 0; i < 13; i++)
    nums.add(i);
Collections.shuffle(nums);
for (int randomNum : nums)
    System.out.println(randomNum); // use the random numbers

【讨论】:

    【解决方案2】:

    我会填写一个列表,打乱它,然后迭代它,保证每次都有不同的数字:

    public static void main(String[] args) {
        int ctr = 13; 
        List<Integer> list = new ArrayList<>(ctr);
        for (int i = 0; i < ctr; ++i) {
            list.add(i);
        }
        Collections.shuffle(list);
    
        for (int i = 0; i < ctr; ++i) {
            System.out.println(ctr + ": " + list.get(i));
        }
    }
    

    【讨论】:

      【解决方案3】:

      问题 - 我想随机取一个 0-13 之间的数字 13 次

      我会从 ListCollections.shuffle(List)Random 开始,比如 -

      Random rand = new Random();
      List<Integer> al = new ArrayList<>();
      for (int i = 0; i < 14; i++) {
        al.add(i);
      }
      Collections.shuffle(al, rand);
      System.out.println(al);
      

      或者,如果使用 Java 8+,则使用 IntStream.range(int, int) 来生成 List。您可以使用forEachOrdered 来显示(在任一版本中,您都可以使用带有隐式随机的Collections.shuffle),例如

      List<Integer> al = IntStream.range(0, 13).boxed().collect(Collectors.toList());
      Collections.shuffle(al);
      al.stream().forEachOrdered(System.out::println);
      

      【讨论】:

        【解决方案4】:

        推荐 shuffle 的答案显示了正确的方式,因为它既优雅又快速。

        为了完整起见:您也可以稍微修改您的代码。将找到的任何随机数添加到数组中。然后检查下一个随机数是否已经在数组中。如果是,请删除该号码并获得一个新号码。这样做直到数组被 13 个数字填充。

        像这样:

        List<Integer> numbers = new ArrayList<Integer>();
        Random r = new Random();
        
        while (numbers.size() < 14) {
        
          randomNum = r.nextInt(13);
        
          if (!numbers.contains(randomNum)) {
            numbers.add(randomNum);
          }
        }
        

        【讨论】:

          【解决方案5】:

          您可以使用设置避免重复
          代码:

              Set<Integer> set1 = new LinkedHashSet<>();
              int ctr = 13;
              int randomNum = 0;
              while (ctr == 13) {
                  Random r = new Random();
                  randomNum = r.nextInt(13);
                  set1.add(randomNum);
                  System.out.print(randomNum + " ");
                  if (set1.size() >= 13) {
                        ctr = 12;
                  }
               }
              System.out.println("");
              set1.forEach(i -> System.out.print(" " + i));
          

          输出:

          4 11 11 11 5 1 9 12 5 7 5 2 9 10 1 7 10 3 11 8 9 3 12 9 2 6 7 10 12 3 11 1 10 3 6 2 0 
          4 11 5 1 9 12 7 2 10 3 8 6 0
          

          【讨论】:

          • HashSet 以实现定义的顺序进行迭代,这将破坏 Random 首先为您提供的熵。
          • 这里的一个问题是您的答案不包括所有值 0-13。
          • @Elliott Frisch 返回一个伪随机、均匀分布的 int 值,介于 0(包括)和指定值(不包括)之间,因此肯定会包括 0 并排除 13 docs.oracle.com/javase/7/docs/api/java/util/…
          • 您正在做的是将 13 个随机数添加到一个集合中。如果有重复,您最终将只有 12 个数字,因为重复将被删除。此外,然后您正在迭代集合,据我们所知(并且保证)可能会按数字顺序迭代它们,这违背了目的。
          • 感谢您的回复,但 OP 不希望重复。我说的对吗?
          【解决方案6】:
          ArrayList<Integer> nums = new ArrayList<Integer>();
          Random generator = new Random();
          for (int i = 0; i < 14; i++) {
              nums.add(i);
          }
          for (int i = 0; i < 14; i++) {
              int size = nums.size();
              int chosen = generator.nextInt(size);
              System.out.println(nums.get(chosen) + " ");
              nums.remove(chosen);
          }
          

          【讨论】:

            猜你喜欢
            • 2012-10-04
            • 2011-11-07
            • 1970-01-01
            • 1970-01-01
            • 2014-04-27
            • 2013-11-12
            • 2015-09-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多