C# 如何在以下标准上生成密码

C# 如何在以下标准上生成密码,c#,C#,我想根据以下标准生成密码。 一个大写字母 10个小写字母 最后是四个数字 我有密码 //Gnerating a random password string allowedChars = ""; allowedChars = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,"; allowedChars += "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S

我想根据以下标准生成密码。 一个大写字母 10个小写字母 最后是四个数字 我有密码

 //Gnerating a random password
        string allowedChars = "";

        allowedChars = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,";

        allowedChars += "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,";

        allowedChars += "1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,&,?";

        char[] sep = { ',' };

        string[] arr = allowedChars.Split(sep);

        string passwordString = "";

        string tempString = "";
        int PasswordLength = 16;

        Random rand = new Random();

        for (int i = 0; i < Convert.ToInt32(PasswordLength); i++)

        {

            tempString = arr[rand.Next(0, arr.Length)];

            passwordString += tempString;

        }
//随机设置密码
字符串allowedChars=“”;
allowedChars=“a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,”;
allowedChars+=“A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z”;
允许字符+=“1,2,3,4,5,6,7,8,9,0,!,@,#,$,%,&,”;
char[]sep={',};
字符串[]arr=允许的字符分割(sep);
字符串passwordString=“”;
字符串tempString=“”;
int PasswordLength=16;
Random rand=新的Random();
for(int i=0;i
您需要通过以下方式向密码字符串添加不同的字符:

    string lowerChars = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,";
    string[] lowerCharsArr = lowerChars.Split(sep);
    string upperChars = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,";
    string[] upperCharsArr = upperChars.Split(sep);
    string numbers = "1,2,3,4,5,6,7,8,9,0";
    string[] numbersArr = numbers.Split(sep);
    string others = "!,@,#,$,%,&,?";
    string[] othersArr = others.Split(sep);


    string passwordString = "";

    int PasswordLength = 16;

    Random rand = new Random();

    passwordString += upperChars[rand.Next(0, upperChars.Length)];

    for (int i = 1; i < Convert.ToInt32(PasswordLength -4); i++)
    {
        passwordString += lowerChars[rand.Next(0, lowerChars.Length)];
    }
    for (int i = 0; i < 4; i++)
    {
        passwordString += numbersArr[rand.Next(0, numbersArr.Length)];
    }
string lowercars=“a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,”;
字符串[]LowerCarsArr=LowerCars.Split(sep);
字符串upperChars=“A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,”;
字符串[]upperCharsArr=upperChars.Split(sep);
字符串编号=“1,2,3,4,5,6,7,8,9,0”;
字符串[]numbersArr=numbers.Split(sep);
字符串others=“!、@、#、$、%、&、”;
字符串[]othersArr=others.Split(sep);
字符串passwordString=“”;
int PasswordLength=16;
Random rand=新的Random();
passwordString+=upperChars[rand.Next(0,upperChars.Length)];
for(inti=1;i
无需同时创建上限和下限值集。我们有更改案例的代码。您还可以将实际拾取提取到单独的方法中,这将使测试更容易

以下是我的尝试:

void Main()
{
    char[] lowerCase = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    char[] numbers = new char[] {'0','1','2','3','4','5','6','7','8','9'};
    // Create the Random outside the method to avoid reseeding
    Random random = new Random();
    // Pick one char and make it uppercase
    string password = PickRandomValueFromValueSet(1, lowerCase, random).ToUpper();
    // Pick 10 lowercase chars
    password+= PickRandomValueFromValueSet(10, lowerCase, random);
    // Pick 4 digits
    password+= PickRandomValueFromValueSet(4, numbers, random);
    Console.Out.WriteLine.(password);
}

string PickRandomValueFromValueSet(int number, char[] valueSet, Random random)
{
    string result = "";
    for (int i = 0; i < number; i++)
    {
        result += valueSet[random.Next(0, valueSet.Length)];
    }
    return result;
}
void Main()
{
char[]小写=新的char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char[]numbers=新字符[]{'0'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'};
//在方法外部创建随机值以避免重新播种
随机=新随机();
//选择一个字符并使其大写
字符串密码=PickRandomValueFromValueSet(1,小写,随机)。ToUpper();
//选择10个小写字符
密码+=PickRandomValueFromValueSet(10,小写,随机);
//选择4位数字
password+=从ValueSet中选取RandomValueFromValueSet(4,数字,随机);
控制台输出写入线(密码);
}
字符串PickRandomValueFromValueSet(整数,字符[]值集,随机)
{
字符串结果=”;
for(int i=0;i

我不明白为什么
@
#
$
%
&
被允许作为问题中的数字。我已经省略了它们。

这里有一种方法可以做到这一点,可以选择使用扩展方法对结果进行无序排列。
.Shuffle
,但是如果您确实想保持先高后低的顺序,最后是4位/符号的顺序,那么就不必考虑了

namespace PasswordGen
{
    public class Program
    {
        private static Random _random = new Random();

        static void Main(string[] args)
        {
            var nonAlphaSymbols = "1234567890!@#$%&?";
            var password = new[] { (char)_random.Next('A', 'Z' + 1) } // upper case character
                .Concat(Enumerable.Range(0, 10).Select(a => (char)_random.Next('a', 'z' + 1)) // 10 lower case
                .Concat(Enumerable.Range(0, 4).Select(a => nonAlphaSymbols[_random.Next(0, nonAlphaSymbols.Length)]))) // 4 from nonAlpha
                .Shuffle(); // optional, if you want to shuffle the outcome

            Console.WriteLine(new string(password.ToArray()));
        }

    }

    public static class Extensions
    {   
        private static Random _random = new Random();

        public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> input)
        {
            List<T> output = new List<T>(input);
            for (int i = 0; i < output.Count; i++)
            {
                var swapTarget = _random.Next(i, output.Count - 1);
                T temp = output[swapTarget];
                output[swapTarget] = output[i];
                output[i] = temp;
            }
            return output;
        }
    }
}
名称空间密码生成器
{
公共课程
{
私有静态随机_Random=新随机();
静态void Main(字符串[]参数)
{
var nonAlphaSymbols=“1234567890!@#$%&”;
var password=new[]{(char)\u random.Next('A','Z'+1)}//大写字符
.Concat(可枚举的.Range(0,10)。选择(a=>(char)_random.Next('a','z'+1))//10小写
.Concat(可枚举的.Range(0,4).选择(a=>nonAlphaSymbols[\u random.Next(0,nonAlphaSymbols.Length)])//4 from nonAlpha
.Shuffle();//可选,如果要对结果进行随机播放
WriteLine(新字符串(password.ToArray());
}
}
公共静态类扩展
{   
私有静态随机_Random=新随机();
公共静态IEnumerable Shuffle(此IEnumerable输入)
{
列表输出=新列表(输入);
for(int i=0;i

示例:

随机选取一个大写字母,随机选取10个小写字母,随机选取4位数字,将它们放入一个通用列表并将其洗牌(堆栈溢出上应该有很多示例,否则google for Fisher-Yates洗牌),您应该拥有密码。我将把它作为一个练习留给读者来决定这是否真的会产生一个好的密码。@Liam出于某种原因,当我看到漫画时我记得的密码是“Mr.Ed”,对于大多数网站来说,这总是太短了。小写字母和大写字母中的最后一个逗号将导致数组中出现空字符串,并允许创建少于15个字符且不以大写字母开头的密码。这是一个非常优雅的解决方案,但您需要对
Random.Next
的上限做些什么,因为它们是排他性的。您将无法使用Z或Z或?生成任何内容。抱歉(编辑我的评论为时已晚),您将能够生成
,因为您使用的是长度,而不是
Z
Z