C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でリストからランダムな要素を選択する方法を解説

C#でリスト(List)の中からランダムに要素を1つ選択したい場面は多くあります。くじ引きのような抽選処理や、ゲーム内でのランダムイベントなど、さまざまな用途で活用できます。この記事では、Randomクラスを使ったシンプルで確実な方法を解説します。

基本的な考え方

リストからランダムな要素を取得するには、以下の手順を行います。

  1. リストを作成する
  2. リストの要素数を取得する
  3. Random.Next()メソッドで0以上・要素数未満のインデックスを生成する
  4. そのインデックスを使って要素にアクセスする

手順1:リストを用意する

まず、C#でリストを定義します。

var list = new List<string>{ "one", "two", "three", "four" };

手順2:ランダムなインデックスを生成して表示する

次に、リストの要素数を取得し、random.Next(list.Count)でランダムなインデックスを生成します。Next()は指定した最大値「未満」の整数を返すため、配列の範囲外エラー(IndexOutOfRangeException)が発生することはありません。

int index = random.Next(list.Count);
Console.WriteLine(list[index]);

完全なサンプルコード

ここまでの手順をまとめると、リストからランダムな要素を選択するコードは以下のようになります。

using System;
using System.Collections.Generic;

namespace Demo {
    class Program {
        static void Main(string[] args) {
            var random = new Random();
            var list = new List<string>{ "one", "two", "three", "four" };
            int index = random.Next(list.Count);
            Console.WriteLine(list[index]);
        }
    }
}

実行結果

実行するたびに異なる要素が出力されます。たとえば、次のように表示されることがあります。

three

補足:複数回ランダムに選択したい場合

同じRandomインスタンスを再利用すれば、ループ処理の中で何度でもランダムな要素を取り出せます。

for (int i = 0; i < 5; i++) {
    int index = random.Next(list.Count);
    Console.WriteLine(list[index]);
}

なお、ループごとにnew Random()を生成すると、短時間に連続して作成された場合に同じシード値が使われ、同じ値ばかり返されることがあります。必ずインスタンスは使い回すようにしましょう。

  1. Redis LINDEXコマンドの使い方 – リストから指定インデックスの要素を取得する方法

    このチュートリアルでは、Redisのリスト型データから特定のインデックス位置にある要素を取得する方法について解説します。要素の取得には、RedisのLINDEXコマンドを使用します。 LINDEXコマンドとは LINDEXコマンドは、キーに格納されたリスト値の中から、指定したインデックス位置にある要素を返します。 インデックスはゼロベース(0始まり)で扱われます。つまり、「0」は先頭の要素、「1」は2番目の要素を意味します。また、負の数値を使うことも可能で、「-1」は末尾の要素、「-2」は末尾から2番目の要素といった具合に、後ろから数えた位置を指定できます。 なお、範囲外のインデックス値を指定

  2. Redis LREMコマンドの使い方|リストから要素を1つまたは複数削除する方法

    このチュートリアルでは、キーに保存されたリスト値から、特定の要素を1つまたは複数削除する方法を解説します。そのために使用するのが、RedisのLREMコマンドです。 LREMコマンドとは LREMコマンドは、キーに格納されたリストから、指定した要素の出現箇所をcount引数で指定した回数だけ削除します。引数countの値によって、削除の動作は以下のように変化します。 count > 0 の場合:先頭(head)から末尾(tail)に向かって、指定した要素をcount個削除します。 count < 0 の場合:末尾(tail)から先頭(head)に向かって、指定した要素をcount