不要随机编号以前是随机的

时间:2014-08-03 05:17:45

标签: java random

我知道如何使用java Random class随机编号。

这会随机出现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 ;

如果第二个随机数是例如(4),那么我的第三个随机数将再次从0-13中任意数字排除5和4 ; 等等.. 有办法吗?

6 个答案:

答案 0 :(得分:12)

这样做:

  • 创建一个大小为13的List
  • 用数字0-12
  • 填写
  • 使用JDK集合实用程序方法
  • 对列表进行随机播放
  • 使用洗牌顺序中的数字(通过迭代列表)

在代码中:

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

答案 1 :(得分:8)

  

问题 - 我想在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);

答案 2 :(得分:8)

我填写一个列表,随机播放,然后迭代它,每次都保证一个不同的数字:

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 :(得分:2)

推荐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);
  }
}

答案 4 :(得分:1)

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

    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

答案 5 :(得分:1)

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);
}