【Unity】【C#】文字列の内容をシャッフルする 
2021/04/04 Sun [edit]
どちらかというと、デバッグ・テスト用になるかも知れないが、文字列の内容をランダムにシャッフルする拡張メソッドを作ってみよう。
実際私はよく実行速度の計測などをするのだが、同じデータ・同じ文字列などでテストするとメモリのキャッシュが効いてしまう可能性もあるので、なるべくランダムなデータを与えるようにしてる。
そういった用途のため簡単に作ったものなので、パフォーマンスはそこそこかも知れないが、以前に紹介した配列のシャッフルの拡張メソッドを使えばすぐにできるものなので、応用みたいな感じで紹介だけしておこう。
(※) Unity 2019.4.21f1 / Windows10(x64) で確認
●文字列の内容をシャッフルする 拡張メソッド
using System;
public static class Extentions //※名前は任意
{
/// <summary>
/// 文字列をシャッフルしたものを返す
/// 2021/04/04 Fantom
/// http://fantom1x.blog130.fc2.com/blog-entry-395.html
/// </summary>
/// <param name="text">元の文字列</param>
/// <returns></returns>
public static string Shuffle(this string text)
{
var array = text.ToCharArray();
array.Shuffle(); //※以前の記事を参照
return new string(array);
}
}
●メインコード例
using System;
using UnityEngine;
var text = "abcあいう漢表示";
int length = 10;
for (int i = 0; i < length; i++)
{
var res = text.Shuffle();
Debug.Log($"[{i}] {res}");
}
[1] いあうb示c表a漢
[2] ab表あ示いcう漢
[3] うcあ漢ba示表い
[4] 示うbca表漢あい
[5] c示aいあ漢う表b
[6] 表ういabc漢あ示
[7] あい表うb漢示ac
[8] b示漢ac表ういあ
[9] baいう示c漢表あ
配列をシャッフルするコードは以前の記事をコピペして欲しい。
・配列・リストのシャッフル
配列・リストのシャッフルのランダム関数(Random)は Unity 用になっているので、標準関数で使いたいなら System の方の Random に書き換えて欲しい。
もし、UnityEngine と System で Random の曖昧エラーが出てるようなら、以下のように using で指定してやると簡単だ。
using Random = UnityEngine.Random;
ちなみにこの「using」の使い方の左辺の名前は何でも良いので、単に長いクラス名を短く表記したいときにも役立つ(using Rnd = UnityEngine.Random; みたいにも書ける)。
拡張メソッドの内容はなんてことはない、一度 string 型を char[] で取り出して、配列をシャッフルして、文字列に戻す、ということをしているだけだ。
テスト用ならこれでも十分だろう。私は Unityエディタ上でよく使っているが、十分なパフォーマンスは出るようだ。
まぁ、文字列が完全に決まっているなら、StringBuilder でシャッフル作るのも良いかも知れない。ランタイムでの文字列処理は GC を発生しやすいので、new をなるべく少なくするに越したことは無いからね。配列も使いまわしにすれば、更に効率的にもなる。ただ、その辺は別問題なので、自分で色々実装してみて欲しい(笑)。
(関連記事)
【Unity】【C#】配列・リストのシャッフル
【C#】2次元配列(ジャグ配列・多次元配列)のソート
【C#】多次元配列とジャグ配列(2次元配列)のサイズ(長さ)、相互変換など
【C#】配列やListなどの中身(要素)を見る拡張メソッド Dump
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/395-567549d5
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |