Java 获取数组中的n个随机元素

Java 获取数组中的n个随机元素,java,Java,我想从数组中获得n个唯一的随机元素 例如: if n = 4; 我想随机得到 array[0], array[3], array[7], array[2] 问题是获取随机整数将很容易导致冲突(psuedocode): 碰撞比比皆是,特别是在小阵列上 解决这个问题的最优雅的方法是什么?您可以使用集合而不是列表,这样可以消除重复项。因此,您还需要更改循环条件。像这样的 while set.size() is less than n { r = generateRandomInteg

我想从数组中获得n个唯一的随机元素

例如:

if n = 4;
我想随机得到

array[0], array[3], array[7], array[2]
问题是获取随机整数将很容易导致冲突(psuedocode):

碰撞比比皆是,特别是在小阵列上


解决这个问题的最优雅的方法是什么?

您可以使用
集合
而不是
列表
,这样可以消除重复项。因此,您还需要更改循环条件。像这样的

while set.size() is less than n
{
       r = generateRandomInteger within n-1
       set.add(array[r]); //if its the same, it won't be added to the set and the size won't increase
}

使用集合可能是最好的选择

如果希望从数组中获得唯一的元素(即数组[]的值),请使用R.J的解决方案。如果需要唯一索引:

while set.size() is less than n
{
       r = generateRandomInteger within n-1
       set.add(r);
}
foreach(r: set)
{
  list.add(array[r]);
}
如果您想要的元素多于数组的长度,请小心,因为您将得到一个无限循环:

if(n>array.length)
{
  print("Cannot get more then ... elements!");
  return null;
}

您可以将所有随机整数添加到一个列表中,并生成一个新的随机整数,直到该列表不包含此随机整数。这不是最佳性能,但它可以工作

       List<Integer> randoms = new ArrayList<Integer>()
       for(int i=0; i<n;i++){
           while(randoms.contains(r)) {
               r = Random.nextInt(array.length-1);
           }
           randoms.add(r);
           list.push(array[r]); 
       }
List randoms=new ArrayList()

对于(inti=0;i你可以用两种方法:我建议你使用第一种方法

首先使用SET:

  for n times
  {
       r = generateRandomInteger within n-1
      // you can use SET instead of LIST cause SET not allow duplication.
       set.push(array[r]); //array[r] can be the same.
  }
第二,使用列表:

  for n times
  {
       r = generateRandomInteger within n-1
       if(!list.contains(array[r]))
            list.push(array[r]);    //array[r] can be the same.
  }
int n=4;
对于(int i=0;i
在这种情况下,我通常会将我要从中选择的所有项目推送到一个集合中

var selectFrom = original.clone; // or build array
var selected = new collection;
for (i = 0; i < toSelect; i++) 
{
    var rndItem = selectFrom[ rand() * selectFrom.length ];
    selected.add(rndItem);
    selectFrom.remove(rndItem);
}
然后我开始删除selectFrom集合中的随机元素

var selectFrom = original.clone; // or build array
var selected = new collection;
for (i = 0; i < toSelect; i++) 
{
    var rndItem = selectFrom[ rand() * selectFrom.length ];
    selected.add(rndItem);
    selectFrom.remove(rndItem);
}
for(i=0;i

通过这种方式,我可以从剩余的内容中随机选择,而不必担心随机数/索引中的冲突。

如果有另一个列表来存储已插入的值,然后在每次插入时进行检查,这将是一个很大的开销。
Set
就是为了这样的目的。为什么要标记3种不同的语言?