在Java中创建唯一的随机数

时间:2012-03-13 14:02:00

标签: java

我正在制作一个随机数(一种猜谜游戏),并提出了ff。代码生成10个一位或两位数字(1或10到40):

public void generate()
{
    for(int i=0; i<=1; i++)
    {
        for(int l=0; l<10; l++)
        {
            Random rdm=new Random();
            arr[l] = rdm.nextInt(range)+1;

        }
    }
}

但是,此代码仅回答生成10个随机一位或两位数字的需要。我需要让这个程序生成唯一的随机数。我怎么能这样做?

对不起后期更新...我想对这个程序做的是,如果数组包含重复项,那么该副本将被替换为唯一的...

==============解决=====

新问题:

HashSet set=new HashSet();
Random random=new Random();

while(set.Size()<10)
{
    set.add(random.nextInt(range)+1);
}

lbtest.setText(set.toString());
bgen.setEnabled(false);
gametext.setText("");

按照ggrigery的要求:

这里是关于ggrigery建议的更新代码。

5 个答案:

答案 0 :(得分:5)

另一种选择是使用随机播放。

List<Integer> all = new ArrayList<>();
for(int i=1;i<=range;i++) all.add(i);
Collections.shuffle(all);
List<Integer> selected = all.subList(0, 10);

如果要选择每个元素,如果要丢弃重复项,则可能需要很长时间才能找到最后一个随机值。无论您选择一个元素还是所有元素,此方法都需要相同的时间。

答案 1 :(得分:1)

    HashSet<Integer> set = new HashSet<Integer>();
    Random random = new Random();
    int i = 0;

    while(set.size() < 10){
        set.add(random.nextInt(40) + 1);
        i++;
    }

    System.out.println(set);
    System.out.println(i);

答案 2 :(得分:0)

在数组中进行搜索以了解值是否存在:

private boolean isInsideArray(int randomNumber, int[] arr){
    for(int x = 0; x < arr.length; x++){
        if(arr[x] == randomNumber) return true;

    }
    return false;
}

当你想知道数字是否在数组内时,只需调用此函数。

注意:此代码未经测试,只是一个帮助您的示例。也不是最优雅的解决方案,Java中有许多方法可以帮助您完成此操作而无需循环整个阵列。

答案 3 :(得分:0)

设置保证唯一元素。然后你可以得到结果并将它转换成你想要的任何集合或数组。

public List<Integer> generate() {
   Random random = new Random();
   Set<Integer> set = new LinkedHashSet<Integer>();
   for(int i = 0; i < numberCount; i++) {
      set.add(random.nextInt(range));
   }
   return new ArrayList<Integer>(set);
}

答案 4 :(得分:0)

public void generate() {
    Random rdm = new Random();
    int i = 0;
    while (i < 10) {
        int j = rdm.nextInt(range) + 1;
        if (!arrayContains(j)) {
            arr[i] = j;
            i++;
        }
    }   
}

public boolean arrayContains(int i) {
    for (int k = 0; k < arr.length; k++) {
        if (arr[k] == i)
            return true;
    }
    return false;
}

这应该可以胜任。可能会更优雅。