Java - 生成随机范围的特定数字而不重复这些数字 - 如何?

时间:2011-03-07 20:30:09

标签: java arrays list collections random

听起来很简单......但我一直在试图找到解决方案。

对于一系列数字,比如 1-12 ,我想生成该范围内的随机序列,包括 1 12

我不希望重复的数字

所以我想要这样的东西 - 3,1,8,6,5,4 ..依此类推,每个数字都来自1-12。

然后我想将这些随机数放入Array并使用该数组“随机”选择并在jsp页面上显示一些项目(如从数据库中提取的库存)。

到目前为止我所尝试的问题是,生成了大量重复的号码...或者, ALL 这些数字是选择的。

这个问题有一个简单的解决方案吗?


修改

使用Collectionsshuffle()方法测试#1

ArrayList<Integer> list = new ArrayList<Integer>(10);
for(int i = 0; i < 10; i++)
{
  list.add(i);
}
Collections.shuffle(list);

String[] randomNumbers = (String[])list.toArray();

for(int i = 0; i < 10; i++)
{
  out.print(randomNumbers[i]+"<br>");
}

结果是具有重复值的序列 -
选择= 3
选择= 8
选择= 7
选择= 5
选择= 1
选择= 4
选择= 6
选择= 4
选择= 7
选择= 12

测试#2 - 使用随机数学课

int max = 12;
int min = 1;

int randomNumber = 0;

String str_randomNumber = "";

for(int i=0; i<10; i++) {
    //int choice = 1 + Math.abs(rand.nextInt(11));
    int choice = min + (int)(Math.random() * ((max - min) + 1));

    out.print("chose = "+choice+"<br>");
}

结果就像使用Collections.shuffle()

6 个答案:

答案 0 :(得分:3)

您可以使用1到12之间的所有值填充数组,然后将它们随机播放(请参阅例如Why does Collections.shuffle() fail for my array?

答案 1 :(得分:2)

你可以按顺序将1到12之间的所有数字放入数组中,然后使用一些混洗算法随机化它们的顺序,例如: http://www.leepoint.net/notes-java/algorithms/random/random-shuffling.html

答案 2 :(得分:0)

随机数生成允许重复。如果你想要一系列无重复的随机数,我建议如下:

  1. 生成一个随机数(我将引用一个数字X)。
  2. 添加到Set对象。
  3. 检查Set对象的大小,如果是所需大小,则表示已完成。如果它小于所需的大小,请转到步骤1

答案 3 :(得分:0)

如果您使用MySQL或SQLLite作为数据库,您可以在SELECT查询级别进行此随机化,使用ORDER BY RAND()限制为1-12,您可以将where子句WHERE ID&gt; = 1 AND ID &lt; = 12 ORDER BY RAND()

答案 4 :(得分:0)

这是用于创建随机整数的实用方法:

public static int randomInteger(int min, int max) {
    Random rd = new Random();
    return rd.nextInt((max - min) + 1) + min;
}

这是一种总是产生唯一的整数集的算法:

public static Set<Integer> makeRandomSet(int howManyNumber, int startNumber, int endNumber){
    Set<Integer> integerSet = new HashSet<>();

    boolean couldBeAdded = false;
    for(int i=0; i< howManyNumber; i++) {
        while (!couldBeAdded) {
            Integer randomInt = randomInteger(startNumber, endNumber);
            couldBeAdded = integerSet.add(randomInt);
        }

        couldBeAdded = false;
    }

    return integerSet;
}
  

我们使用了 add方法返回类型来检查Set中的重复值。

这是测试代码:

public static void main(String[] args) {
    Set<Integer> randomSet = makeRandomSet(6, 1, 54);
    System.out.println(randomSet);
}
  

以上代码的输出为 6个随机唯一整数   1到54之间

答案 5 :(得分:-1)

您可以将所需的所有数字放入List中,然后随机排序List,然后将随机排序的列表转换为数组,例如

List<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 12; i++) {
    list.add(i);
}

Collections.sort(list, new Comparator<Integer>() {

    @Override
    public int compare(Integer o1, Integer o2) {
          return Math.random() > 0.5 ? 1 : -1;
    }
);
Integer[] array = list.toArray(new Integer[list.size()]);