Java 获取数组中的n个随机元素
我想从数组中获得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
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种不同的语言?