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

C#で文字列をランダムにシャッフルする方法

C#で文字列の文字をランダムに入れ替える(シャッフルする)には、RandomクラスとLINQのOrderBy()メソッドを組み合わせるのが簡単です。この記事では、その具体的な手順とサンプルコードを紹介します。

手順1:Randomクラスのインスタンスを作成する

まず、乱数を生成するためにRandomクラスのインスタンスを作成します。

Random r = new Random();

手順2:Next()メソッドとOrderBy()で並べ替える

次に、文字列を文字配列に変換し、OrderBy()メソッド内でNext()メソッドを使ってランダムな順序で並べ替えます。

string random = new string(str.ToCharArray().OrderBy(s => (r.Next(2) % 2) == 0).ToArray());

処理の流れ

  • ToCharArray():文字列をchar型の配列に変換します。
  • OrderBy(s => (r.Next(2) % 2) == 0):各文字に対してランダムなbool値(true/false)をキーとして生成し、それに基づいて並べ替えます。
  • ToArray():並べ替えた結果を配列に戻します。
  • new string(...):char配列から新しい文字列を生成します。

完全なサンプルコード

以下は、文字列をランダム化して表示する完全なコード例です。

using System;
using System.IO;
using System.Linq;
class Demo {
    static void Main() {
        const string str = "electronics";
        Random r = new Random();
        string random = new string(str.ToCharArray().OrderBy(s => (r.Next(2) % 2) == 0).ToArray());
        Console.WriteLine("String = {0}", str);
        Console.WriteLine("Random String = {0}", random);
        Console.Read();
    }
}

実行結果

String = electronics
Random String = lericsecton

補足:より確実なシャッフル方法

上記の方法はシンプルですが、乱数キーが重複した場合に並び順が偏る可能性があります。より均等なシャッフルを行いたい場合は、Fisher-Yatesアルゴリズムを実装するか、各文字に対してr.Next()の値を直接キーとして使う方法も検討するとよいでしょう。

string random = new string(str.OrderBy(c => r.Next()).ToArray());

このように書くことで、各文字に一意に近い乱数キーが割り当てられ、より自然なランダム化が実現できます。用途に応じて使い分けてください。

  1. 【C#】String.Join()メソッドで文字列配列を連結する方法

    String.Join()メソッドとはC#のString.Join()メソッドは、文字列配列のすべての要素を1つの文字列に連結するためのメソッドです。各要素の間には、引数で指定した区切り文字(セパレーター)が自動的に挿入されます。たとえば、区切り文字として改行コード「\n」を指定すれば、配列の各要素がそれぞれ別の行に配置された、複数行の文字列を簡単に作成できます。基本的な構文String.Join(\n, starray);第1引数: 要素間に挿入する区切り文字第2引数: 連結対象の文字列配列戻り値: 連結された1つの文字列サンプルコード以下は、5つの文字列要素を持つ配列を改行コードで連結し、

  2. C#で文字列を反転する方法(Array.Reverseの使い方)

    C#で文字列を反転する方法 C#で文字列を逆順に並べ替えたい場合は、Array.Reverse()メソッドを使うのが最も簡単です。文字列はそのままでは直接反転できないため、一度文字配列(char配列)に変換してから反転処理を行います。 文字列を反転するサンプルコード 以下は、文字列を反転して返すカスタムメソッドの例です。ここでは、引数として渡された文字列「Henry」を反転させています。 public static string ReverseFunc(string str) { char[] ch = str.ToCharArray(); Array.Reverse(ch)