Java には最初から乱数を生成するためのクラス
Random.class
がありますが、実はこれには欠点があり、同じシード(種)の場合には結果が同じになってしまいます。
しかし今回ご紹介する2通りの方法であれば、結果が同じになることはなく、完全にランダムな値を取得することが可能です。
1. シードを変える
一番手っ取り早い方法ですが、シードを変えることです。
シードを変えれば、結果が同じになることはありませんから。
Random rand = new Random(System.nanoTime());
List<Player> players = new ArrayList<Player>(Bukkit.getOnlinePlayers());
Player player = players.get(rand.nextInt(players.size());
2. シャッフル
結局プレイヤーを個別に取得するには一度配列にする必要があります。
その際に、配列にするのと同時にシャッフルしてしまおうという方法です。
List<Player> players = new ArrayList<Player>(Bukkit.getOnlinePlayers());
Collections.shuffle(players);
Player player = players.get(0);
https://stackoverflow.com/questions/21092086/get-random-element-from-collection
こちらにあるように
public static T random(Collection coll) {
int num = (int) (Math.random() * coll.size());
for(T t: coll) if (–num < 0) return t;
throw new AssertionError();
}
のような定義してから
Player p = random(Bukkit.getOnlinePlayers());
のようにすると一人だけランダムに取得することができます。
ただ、これだと計算量はO(n)になります。
なるほど!
参考になりました(∩´∀`)∩
ありがとうございます!