【问题标题】:Generating non repeating strings in c#在 C# 中生成不重复的字符串
【发布时间】:2020-07-11 22:10:45
【问题描述】:

目前我正在.net Core 3.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);
                }
            }

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

【问题讨论】:

  • 洗牌你的chars 并拿走其中的passw.Length。这里有很多例子
  • "我创建的随机生成的字符串非常频繁地重复" 通常这是由于在循环中创建 Random 实例引起的。您的实际代码中是否有但未在此处显示?
  • 能不能多解释一下shuffle方法,我的instance或者random在循环之外。我只是注意到这样一个事实,即随着它创造的次数越来越多,重复次数变得非常明显
  • 我没有看到任何重复...你能发布你的完整代码吗?
  • 当你说“重复”时,你的意思是相同的finalstrings 被一遍又一遍地写入控制台吗?还是您的意思是每个特定的finalstring 有时会多次包含相同的字符?

标签: c# .net string random .net-core


【解决方案1】:

这是一个猜词演示,采用“好莱坞”风格:

最终输出:

因为您应该在“破解”密码时始终显示您的进度......并通过猜测随机排序的字母顺序来“破解”它?

制作者:

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();
}

【讨论】:

  • 这是完成我的任务的一种非常酷的方式。通过去掉“.distinct()”就能猜出重复字符正确的单词吗?
  • 好吧,删除.Distinct()(和相关代码)将允许用户输入具有重复字符的单词。然而,随机词算法不允许重复,因为“char”字符串的每个字母只有一个,我们所做的只是打乱这些字符的顺序并取其中的前 X 个。
猜你喜欢
  • 1970-01-01
  • 2021-06-20
  • 2015-12-29
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多