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