Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么随机字符会在随机化过程中丢失?_C#_Random - Fatal编程技术网

C# 为什么随机字符会在随机化过程中丢失?

C# 为什么随机字符会在随机化过程中丢失?,c#,random,C#,Random,编辑:很明显,我第一次问这个问题的时候不够清楚,他们就把问题解决了。我想我很清楚: 为什么Random方法不能正确地随机化字符串 我将以我是C新手作为开场白。这在PowerShell中非常简单,但我想了解如何在C中实现。下面是代码,我将解释什么不起作用 static void Main(string[] args) { var lena = 10; string randomLowercase = Randomiz

编辑:很明显,我第一次问这个问题的时候不够清楚,他们就把问题解决了。我想我很清楚: 为什么Random方法不能正确地随机化字符串

我将以我是C新手作为开场白。这在PowerShell中非常简单,但我想了解如何在C中实现。下面是代码,我将解释什么不起作用

        static void Main(string[] args)
        {
            var lena = 10; 
            string randomLowercase = Randomize("abcdefghijklmnopqrstuvwxyz",lena);
            
            var lenb =2;
            string randomUppercase = Randomize("ZYXWVUTSRQPONMLKJIHGFEDCBA", lenb);

            var lenc = 2;
            string randomNumbers = Randomize("0123456789", lenc);

            var lend = 2;
            string randomSpecChar = Randomize("!%&()?}][{@*", lend);

            string randomWord = randomLowercase + randomUppercase + randomNumbers + randomSpecChar;
            string randomPassword = Randomize(randomWord, randomWord.Length);

            Console.Write("Random Lowercase: {0}\nRandom Uppercase: {1}\nRandom Numbers: {2}\nRandom Special Characters: {3}\n", randomLowercase, randomUppercase, randomNumbers, randomSpecChar);
            
            Console.Write("\nRandom Word Length: {0}\nRandom Word: {1}\n", randomWord.Length, randomWord);
            Console.Write("\nRandom Password: {0}", randomPassword);
            
            Console.Read();
        }

       static string Randomize(string text, int len)
        {
            var chars = text;
            var stringChars = new char[len];
            var random = new Random();

            for (int i = 0; i<stringChars.Length; i++)
            {
                stringChars[i] = chars[random.Next(chars.Length)];
            }

            var output = new String(stringChars);
            return output;
        }
    }
16个字符的混乱效果很好——我得到了“kmrdmcqxlhPN34”。但最后一部分破坏了一些东西。它删除了一个特殊字符“?”,添加了一个额外的“P”和其他一些东西


随机词很好-什么会导致随机方法中的错误?我想这可能是剩余价值?退出该方法时是否应该重置任何变量?

好吧,您要求基于一组值获取一组随机值,当然不能保证您将从源中获取每个字符,这是随机概念的一部分

换句话说,给定1234567890,随机结果1111111是完全有效的


如果你想保证每个类别都有一个角色,你需要改变策略。或者只是对输入重新排序而不是随机化。

随机数字可以是相同的,在这种情况下,您会得到重复的符号。也许你需要这样的洗牌方法。它返回的字符串以随机顺序包含相同的字符

static string Shuffle(string s)
{
   Random rand = new Random();
   var chars = s.ToCharArray();
   for (int i = chars.Length - 1; i > 0; i--)
   {
      int j = rand.Next(i);
      (chars[i], chars[j]) = (chars[j], chars[i]);
   }
 
   return new string(chars);
}

对于最后一部分,一旦您将所有的片段组合到randomWord中,您需要创建一个不同的方法来简单地洗牌现有的字母

可能是这样的:

private static Random R = new Random();

private static string ShuffleString(string text)
{
    return new string(text.ToCharArray().
        OrderBy(c => R.NextDouble()).ToArray());
}
例如:

string a = "Hello World!";
string b = ShuffleString(a);
Console.WriteLine(a);
Console.WriteLine(b);

是的,我想如果你想知道至少有一个大写字母,一个小写字母和一个特殊字符,那么最后你就不能随机化单词。也许可以将每组插入一个随机点?我想你要做的是在你选择了角色集randomWord之后洗牌。这不是你正在做的。查找Fisher-Yates shuffle,寻找一个有效的算法。不清楚你在问什么。您有一种从输入字符串文本中选择len随机字符的方法。当你调用它传递组合字符串时,它就是这样做的。没有理由相信它总是选择相同的值。除此之外,整个密码生成方法都有缺陷。强密码的意义在于很难预测密码中会包含哪些字符,以及这些字符的位置。如果你洗牌最后一个字符串,这对第二部分很有帮助,但是通过限制特定类型字符的数量,第一个破译就像一个符咒!注意,这个答案是在静态变量中的任何函数之外创建随机实例,并在类的静态构造函数中有效地初始化。所有随机化都应该使用相同的静态随机实例。在问题中显示的代码中,var random=new random;在使事物随机化的函数中。不要这样做-创建一个随机实例,并反复使用它。a,你能为这一行中使用的语法发布一个指向文档的链接吗?chars[i],chars[j]=chars[j],chars[i];在我的老同学看来,这太奇怪了……这是什么?@Idle\u Mind谢谢你Danila@别客气
string a = "Hello World!";
string b = ShuffleString(a);
Console.WriteLine(a);
Console.WriteLine(b);