【问题标题】:Generating random numbers with identical pairs between 1 to 8?生成具有 1 到 8 之间相同对的随机数?
【发布时间】:2010-02-25 03:12:43
【问题描述】:

就像我的问题一样,我需要生成在一个范围之间具有相同对的随机数。我试图生成随机数并存储在一个数组中,但这些数字重复了两次以上。我有 16 个随机数要在该范围内生成。知道如何让它只生成相同的随机数对吗?

【问题讨论】:

  • 你能发布一个预期输出的样本吗?我不太明白“相同对”部分。
  • 是的,我需要一个 4x4 的二维数组长度。以 1,2,3,4,5,6,7,8 中的两个作为卡片配对。
  • 这个问题有点令人困惑——如果您需要 [1,8] 范围内的 8 个不同值,则根本不会生成“随机数”。数字完全确定;您要做的就是随机排列它们的顺序。

标签: java


【解决方案1】:

以下将完成我认为的工作:

import java.util.*;

class Randoms {
  public static void main(String[] args) {
    List<Integer> randoms = new ArrayList<Integer>();
    Random randomizer = new Random();
    for(int i = 0; i < 8; ) {
      int r = randomizer.nextInt(8) + 1;
      if(!randoms.contains(r)) {
        randoms.add(r);
        ++i;
      }
    }
    List<Integer> clonedList = new ArrayList<Integer>();
    clonedList.addAll(randoms);
    Collections.shuffle(clonedList);

    int[][] cards = new int[8][];
    for(int i = 0; i < 8; ++i) {
      cards[i] = new int[]{ randoms.get(i), clonedList.get(i) };
    }

    for(int i = 0; i < 8; ++i) {
      System.out.println(cards[i][0] + " " + cards[i][1]);
    }
  }
}

上面的一个示例运行给出:

1 2
8 6
4 3
3 7
2 8
6 1
5 5
7 4

希望对您有所帮助。

【讨论】:

  • 谢谢!这真的对我有帮助!这就是我想要寻找的。 =)
  • 理解答案,但我不太明白这个问题。你是怎么得出这个结论的?
  • @Oscar :随机猜测......结果证明是正确的。 ;-)
  • 呵呵,你获得了“读心术”徽章:) meta.stackexchange.com/questions/30965/…
  • @Oscar :哈哈,太搞笑了……xD
【解决方案2】:

通常,如果您将希望生成的数字放入一个数组中(在您的情况下,一个长度为 16 的数组,每个数组有两个 1、2、...、8),然后随机排列该数组,您将得到你想要的。您可以使用代码here 随机排列数组。

【讨论】:

  • 是的,我需要一个 4x4 的二维数组长度。以 1,2,3,4,5,6,7,8 中的两个作为卡片配对。
【解决方案3】:

我相信这清楚地向您展示了如何解决这个问题:

public static List<Integer> shuffled8() {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 1; i <= 8; i++) {
        list.add(i);
    }
    Collections.shuffle(list);
    return list;
}

public static void main(String[] args) {
    List<Integer> first = shuffled8();
    List<Integer> second= shuffled8();
    for (int i = 0; i < 8; i++) {
        System.out.println(first.get(i) + " " + second.get(i));
    }
}

shuffled8 只返回一个数字 1 到 8 的列表。由于您需要两个这样的列表,因此您调用它两次,并将其存储在firstsecond 中。然后将first.get(i)second.get(i) 配对以获得所需的属性。

为了概括这一点,如果您需要三元组,那么您只需添加List&lt;Integer&gt; third = shuffled8();,然后first.get(i), second.get(i), third.get(i) 就是具有您想要的属性的三元组。

【讨论】:

    【解决方案4】:

    我是这样做的:

        Random random = new Random();
        List<Integer> listaCartoes = new ArrayList<Integer>();
    
        for(int i=0; i<8;)
        {
           int r = random.nextInt(8) + 1;
           if(!listaCartoes.contains(r)) 
           {
              listaCartoes.add(r);
              listaCartoes.add(r);
              ++i;
           }
        }
    
        Collections.shuffle(listaCartoes);
    

    希望对你有所帮助^_^

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2011-07-07
      • 2011-01-23
      • 1970-01-01
      相关资源
      最近更新 更多