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

Bre*_*ead 79 java

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

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

Chr*_*ett 156

public static int getRandom(int[] array) {
    int rnd = new Random().nextInt(array.length);
    return array[rnd];
}
Run Code Online (Sandbox Code Playgroud)

  • 每次运行函数时我都不会创建`Random()`:随机生成器应该有历史记录.如果没有,它是非常可预测的.在这种情况下,这根本不是问题 - 但应该提到`array [(int)(System.currentTimeMillis()%array.length)]`和提出的解决方案一样好. (18认同)
  • @alf,这远远不如提议的解决方案.`new Random()`尝试创建一个与之前创建的"Random"不同的种子实例.只需在短时间内调用两次函数,您的方法就会破坏性. (4认同)
  • 我刚刚注意到一条通知我对这个答案进行了低估 - 我必须不小心点击它; 不幸的是,界面不会让我撤消它(它说我不能改变我的投票,除非编辑答案......).所以,向Chris Dennett道歉. (3认同)
  • 是的,但是你必须告诉 `generator` 是 `java.util.Random` 的一个实例 (2认同)

Luc*_*ore 11

您可以使用Random生成器生成随机索引并返回该索引处的元素:

//initialization
Random generator = new Random();
int randomIndex = generator.nextInt(myArray.length);
return myArray[randomIndex];
Run Code Online (Sandbox Code Playgroud)


hev*_*ev1 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);
Run Code Online (Sandbox Code Playgroud)

也可以编写通用版本,但它不适用于原始数组。

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);
Run Code Online (Sandbox Code Playgroud)


Ste*_*ler 8

如果您要多次获取随机元素,则需要确保您的随机数生成器仅初始化一次.

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)];
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要选择需要不可预测的随机数组元素,则应使用java.security.SecureRandom而不是Random.这确保了如果有人知道最后几个选秀权,他们将无法猜测下一个选秀权.

如果你正在寻找接从使用泛型对象数组随机数,可以定义为(来源这么做的方法阿维纳什- [R从字符串数组随机元素):

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)]; 
    }
}
Run Code Online (Sandbox Code Playgroud)


AlQ*_*fir 5

使用随机类:

int getRandomNumber(int[] arr)
{
  return arr[(new Random()).nextInt(arr.length)];
}
Run Code Online (Sandbox Code Playgroud)


rat*_*eak 5

您还可以使用

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

Math.random()返回介于(包含)到(不包含)double之间的值0.01.0

将此乘以array.length得出介于(包含)和(不包含)double之间的值0.0array.length

转换为将向下舍入,为您提供(含)和(含)int之间的整数0array.length-1