C# 在c语言中生成非重复字符串

C# 在c语言中生成非重复字符串,c#,.net,string,random,.net-core,C#,.net,String,Random,.net Core,目前我正在.NETCore3.1中编写一个基于控制台的程序。该程序的目标是让用户输入一个字符串,然后控制台将尝试猜测它。例如: What shall I guess: string Ok Guessing String... Code Cracked :) Your code is: string 无论如何,当我创建程序时,我遇到了一个问题。我创建的随机生成的字符串经常重复,如果代码更长,问题就会成倍增加 我用它来生成随机字符串 string passw = Console.Readline

目前我正在.NETCore3.1中编写一个基于控制台的程序。该程序的目标是让用户输入一个字符串,然后控制台将尝试猜测它。例如:

What shall I guess: string
Ok Guessing String...

Code Cracked :) Your code is: string

无论如何,当我创建程序时,我遇到了一个问题。我创建的随机生成的字符串经常重复,如果代码更长,问题就会成倍增加

我用它来生成随机字符串

string passw = Console.Readline();

for (int i = 0; i > -1; i++)
            {
                var chars = "abcdefghijklmnopqrstuvwxyz";
                var stringChars = new char[passw.Length];

                for (int a = 0; a < passw.Length; a++)
                {
                    stringChars[a] = chars[rnd.Next(chars.Length)];
                }

                var finalstring = new String(stringChars);
                Console.WriteLine(finalstring);

                if (finalstring== passw)
                {
                    Console.WriteLine("");
                    Console.WriteLine("Password Guessed: " + finalstring);
                    Console.WriteLine("It took a total of: " + i + " guesses!");
                    Environment.Exit(0);
                }
            }

我怎样才能达到目标?我看到了一些关于列表和类似的东西,但我想知道是否有更好的方法来获得我想要的结果。非常感谢。如果需要,我可以澄清任何事情

这是一个猜词演示,以好莱坞风格完成:

最终输出:

因为破解密码时,您应该始终显示您的进度…并通过猜测随机排序的字母顺序来破解密码

制作人:

static void Main(string[] args)
{
    string guess;
    char response;
    int tries = 0;            
    Random rnd = new Random();
    var chars = "abcdefghijklmnopqrstuvwxyz".ToCharArray();

    do
    {
        Console.Clear();
        Console.Write("Enter a word with no characters repeated in it: ");
        string wordToGuess = Console.ReadLine().ToLower();

        var letters = wordToGuess.ToCharArray().Distinct();
        if (letters.All(c => char.IsLetter(c)) && letters.Count() == wordToGuess.Length && wordToGuess.Length > 0)
        {
            Console.WriteLine("Trying to guess your word...");
            int row = Console.CursorTop;
            Console.CursorVisible = false;
            tries = 0;
            do
            {
                tries++;
                var shuffled = (chars.OrderBy(c => rnd.Next())).ToArray();
                guess = new String(shuffled.Take(wordToGuess.Length).ToArray());
                Console.SetCursorPosition(0, row);
                Console.WriteLine("chars = " + new string(shuffled));
                Console.Write("Guess: {0}, Tries: {1}", guess, tries.ToString("N0"));
            } while (guess != wordToGuess);
            Console.WriteLine();
            Console.WriteLine("It took me {0} tries to guess your word: {1}", tries.ToString("N0"), guess);
        }
        else
        {
            Console.WriteLine("Invalid word to guess!");
        }
       
        Console.CursorVisible = true;
        Console.Write("Play again? Y/N: ");
        response = Console.ReadKey().KeyChar;
        Console.WriteLine();
    } while (response == 'y' || response == 'Y');
                
    Console.Write("Press Enter to Quit");
    Console.ReadLine();
}

洗牌,然后取一段长度。我创建的随机生成的字符串经常重复,这通常是因为在循环中创建了随机的实例。你的实际代码中有这个,但没有在这里显示吗?你能详细解释一下shuffle方法吗?我的实例或random在循环之外。我刚刚注意到一个事实,当它创造了更多的时候,它变得非常明显,重复的数量我没有看到任何重复…你能发布你的完整代码吗?当你说“重复”时,你是说相同的最终字符串被一遍又一遍地写入控制台吗?或者你的意思是,每一个特定的结局有时包含同一个角色不止一次?这是一个非常酷的方式来完成我的任务。通过删除.distinct,它将能够正确地猜测具有重复字符的单词?嗯,删除.distinct和相关代码将允许用户输入具有重复字符的单词。但是,随机字算法不允许重复,因为字符字符串中每个字母只有一个,我们所做的就是对这些字符的顺序进行洗牌,并取其中的前X个字符。