如何从数组中随机选择一个元素

145

我正在寻找从整数数组中随机选择数字的解决方案。

例如,我有一个数组new int[]{1,2,3},如何随机选择一个数字?


请参考此链接:http://download.oracle.com/javase/1.5.0/docs/api/java/util/Random.html#nextInt%28int%29。 - Mithun Sasidharan
13个回答

244
public static int getRandom(int[] array) {
    int rnd = new Random().nextInt(array.length);
    return array[rnd];
}

3
Тў»уџё№╝їСйєТў»СйажюђУдЂУ»┤ТўјgeneratorТў»java.util.Randomу▒╗уџёСИђСИфт«ъСЙІсђѓ - stivlo
36
在运行函数时,我不会每次都创建一个Random():随机数生成器应该具有历史记录。如果没有历史记录,它就非常易于预测。在这种情况下这并不是一个问题——但应该提到array[(int)(System.currentTimeMillis() % array.length)]同样好用于所提出的解决方案。 - alf
8
@alf,这远远不及所提出的解决方案好。new Random() 尝试创建一个具有与以前创建的任何 Random 实例不同的种子的实例。您的方法如果在短时间内调用函数两次将会出现严重问题。 - aioobe
3
我刚才注意到一个通知,说我不小心把这个回答踩了,很遗憾界面不允许我取消(它说除非这个回答被编辑了,否则我不能改变我的投票)。所以,对Chris Dennett表示歉意。 - Peter Hanley
1
提醒一下:如果您的数组大小为零,可能会出现IllegalArgumentException异常,因为rand.nextint(n)返回从0(包括)到0(不包括)的整数。 请参见https://stackoverflow.com/a/19304656/8917573。 - thegoodhunter-9115
显示剩余7条评论

18
你可以使用随机数生成器来生成一个随机索引,并返回该索引对应的元素:
//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];

15
如果您需要多次获取随机元素,则应确保仅初始化一次随机数生成器。
import java.util.Random;

public class RandArray {
    private int[] items = new int[]{1,2,3};

    private Random rand = new Random();

    public int getRandArrayElement(){
        return items[rand.nextInt(items.length)];
    }
}

如果您需要选择随机的数组元素并且需要保证不可预测性,建议使用java.security.SecureRandom而非Random。这可以确保即使有人知道了最近几次的选择结果,也无法猜测下一次的结果。
如果您需要使用泛型从对象数组中选择一个随机数,可以定义一个方法来实现(参考Avinash RRandom element from string array中的源代码)。
import java.util.Random;

public class RandArray {
    private static Random rand = new Random();

    private static <T> T randomFrom(T... items) { 
         return items[rand.nextInt(items.length)]; 
    }
}

9

在Java 7中,可以使用ThreadLocalRandom

这是一个仅限于当前线程的随机数生成器。类似于Math类使用的全局Random生成器一样,ThreadLocalRandom使用内部生成的种子进行初始化,可能不会被修改。在并发程序中,如果适用的话,使用ThreadLocalRandom而不是共享的Random对象通常会遇到更少的开销和争用。当多个任务(例如每个ForkJoinTask)在线程池中并行使用随机数时,使用ThreadLocalRandom特别合适。

public static int getRandomElement(int[] arr){
    return arr[ThreadLocalRandom.current().nextInt(arr.length)];
}

//Example Usage:
int[] nums = {1, 2, 3, 4};
int randNum = getRandomElement(nums);
System.out.println(randNum);

也可以编写通用版本,但对于原始数组不起作用。

public static <T> T getRandomElement(T[] arr){
   return arr[ThreadLocalRandom.current().nextInt(arr.length)];
}

//Example Usage:
String[] strs = {"aa", "bb", "cc"};
String randStr = getRandomElement(strs);
System.out.println(randStr);

5
使用Random类:

使用Random类:

int getRandomNumber(int[] arr)
{
  return arr[(new Random()).nextInt(arr.length)];
}

5
您可以使用

标签。

public static int getRandom(int[] array) {
    int rnd = (int)(Math.random()*array.length);
    return array[rnd];
}

Math.random()会返回一个double类型的数字,范围在0.0(包含)到1.0(不包含)之间。

将这个数字乘以array.length,可以得到一个double类型的数字,范围在0.0(包含)到array.length(不包含)之间。

将这个数字强制转换为int类型,会向下取整,得到一个整数,范围在0(包含)到array.length-1(包含)之间。


Math.random() 返回的是 double 类型而不是 int 类型。如果返回 int 类型,那么只会有两个可能的值 0 和 1。 - Akshay R.

3

使用 java.util.Random 生成一个介于0和数组长度之间的随机数:random_number,然后使用这个随机数获取整数:array[random_number]


2

Java在java.util包中有一个Random类。使用它,您可以执行以下操作:

Random rnd = new Random();
int randomNumberFromArray = array[rnd.nextInt(3)];

希望这能帮到您!

1

1

既然你已经安装了Java 8,另一种解决方案是使用Stream API。

new Random().ints(1, 500).limit(500).forEach(p -> System.out.println(list[p]));

1是最低的整数(包含),500是最高的整数(不包含)。limit表示您的流的长度为500。

 int[] list = new int[] {1,2,3,4,5,6};
 new Random().ints(0, list.length).limit(10).forEach(p -> System.out.println(list[p])); 

Random来自java.util包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接