【Bukkit/Spigot】ランダムなプレイヤーを取得する方法

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);

 

投稿者:

kema

趣味でプログラミングしてるだけの人

「【Bukkit/Spigot】ランダムなプレイヤーを取得する方法」への2件のフィードバック

  1. 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)になります。

コメントを残す