前提・実現したいこと
ランダムな文字列を得たいため、ごく普通と思うコードをプログラムしました。
C#,WPF,MVVMで簡単なコードですが、for文の中で文字列を生成しています。
発生している問題・エラーメッセージ
for文の中でStringBuilderにて別な関数にて生成した文字列を取得していますが、Thread.Sleep(20);の遅延?を入れないと、戻り値である複数行の文字列は同じになってしまいます。
なぜ、下記のようになるか理由・原因等をお教えいただきたくお願いします。
該当のソースコード
Models:
class RandomStr
{
private static readonly string NumStrChars = "0123456789";
// 一部を除く l
private static readonly string SmallStrChars = "abcdefghijkmnopqrstuvwxyz";
// 一部を除く I,O
private static readonly string LargeStrChars = "ABCDEFGHJKLMNPQRSTUVWXYZ";
// 記号は全部を除く
private static readonly string SymbolStrChars = "";
// 数字を含む
private string SrcStr = NumStrChars + SmallStrChars + LargeStrChars + SymbolStrChars;
public string GenerateRandomStr(int length) { StringBuilder sb = new StringBuilder(length); Random r = new Random(); int lenStr = SrcStr.Length; for (int i = 0; i < (length -1); i++) sb.Append(SrcStr[r.Next(lenStr)]); return sb.ToString(); }
}
ViewModels:
class MainViewModel
{
public string Rstr
{
get { return StrRandomStr(5); }
set { }
}
private string StrRandomStr(int n) { var rs = new Models.RandomStr(); StringBuilder sbr = new StringBuilder(); for (int i = 0; i< n; i++) { sbr.Append(rs.GenerateRandomStr(8)); sbr.Append(Environment.NewLine); Thread.Sleep(20); // ← これを入れないと全部同じ値を返す } return ("Result =====" + Environment.NewLine + sbr.ToString()); }
}
試したこと
実行例を示します。
例:Sleep(0)の場合
Result =====
J29DeMas
J29DeMas
J29DeMas
J29DeMas
J29DeMas
例:Sleep(20)の場合
Result =====
BrTeBYfj
nQf34WAn
edKfQ2iU
wVWF31tW
G1Ah36nu
ハードウェアの違いかと思い、2台のPCで実行しましたが、同様な結果になりました。
補足情報(FW/ツールのバージョンなど)
ツールは Visual Studio Community 2017 です。
参考ウェブサイト
https://dobon.net/vb/dotnet/string/generatepassword.html
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/26 09:16