パスワードを生成するにあたり、以下のルールで作ってみました。
・重複したパスワードは生成禁止
・英大文字、英子文字、数字を必ず1文字使う。
・使いたくない文字は指定可能 ※下記例では数字の0を使わない
・生成件数、パスワード長は指定可能
基本的には★印のところを修正していただければOKです。
Program.cs
// ・数字、小文字、大文字をランダムな位置に挿入
// ・使える文字種類は変数に指定(★印参照)
// ・生成する件数、パスワード長さ、ファイルは定数で指定(★印参照)
using System.Text;
// 使える文字種類を指定
var numbers = "123456789"; // 数字★
var lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz"; // 小文字★
var upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 大文字★
//生成する件数★
const int CountToGeneratePassword = 400000;
//パスワードを生成する長さを定数で表現★
const int PasswordLength = 10;
//書き込み先★
const string WriteFileFullPath = @"c:\output\passwords.txt";
//----------------ここからロジック------------------------
var random = new Random();
//ファイルストリームの生成
using var fs = new FileStream(WriteFileFullPath, FileMode.Create, FileAccess.Write);
//重複確認用に、HashSetを生成
var hashSet = new HashSet<string>();
// 指定件数の文字列を生成する
for (int i = 0; i < CountToGeneratePassword; i++)
{
var result = new StringBuilder();
// 長さPasswordLengthのランダムな文字列を生成
for (int j = 0; j < PasswordLength; j++)
{
var allChars = numbers + lowerCaseLetters + upperCaseLetters;
result.Append(allChars[random.Next(allChars.Length)]);
}
// 数字、小文字、大文字をランダムな位置に挿入
var randomNumbers = new List<int>();
while (randomNumbers.Count < 3)
{
var number = random.Next(10);
if (!randomNumbers.Contains(number))
{
randomNumbers.Add(number);
}
}
result[randomNumbers[0]] = numbers[random.Next(numbers.Length)];
result[randomNumbers[1]] = lowerCaseLetters[random.Next(lowerCaseLetters.Length)];
result[randomNumbers[2]] = upperCaseLetters[random.Next(upperCaseLetters.Length)];
// 生成した文字列が重複していないか確認
if (hashSet.Contains(result.ToString()))
{
i--;
continue;
}
// 重複していない場合は、HashSetに追加
hashSet.Add(result.ToString());
// ファイルに書き込み
fs.Write(Encoding.UTF8.GetBytes(result.ToString() + "\n"));
}