嗨,我正在尝试用C#编写基本的控制台Pexeso游戏。我想知道如何生成一对且只有一对大写字母。
到目前为止,我的代码可以生成随机大写字母的字符串,但我不知道如何控制它只生成两个,每个只生成两个。
string chars = "AABBCCDDEEFFGGHHIIJJKKLL";
var stringChars = new char[24];
Random random = new Random();
for (int i = 0; i < stringChars.Length; i++)
{
stringChars[i] = chars[random.Next(chars.Length)];
}
string finalString = new String(stringChars);
Console.WriteLine(finalString);
非常感谢您的帮助。
您可以通过在最终序列中定义所需的所有项目来开始。
接下来你要做的就是不要像你现在那样从该列表中获取项目(以一种你可以多次使用它们的方式),而不是实际上想要洗牌。
想象一下,你的信件是打牌,你需要两套。你洗牌,你有一系列扑克牌,每张牌都出现两次。
要改组你的字母或任何给定的序列,你可以使用Fisher-Yates shuffle。
像这样的东西应该做的伎俩:
for (int i = chars.Length - 1; i > 0; i--)
{
char j = random.Next(i + 1);
int temp = chars[i];
chars[i] = chars[j];
chars[j] = temp;
}
现在你不再需要你的finalString
:你想要的结果是你的chars
阵列。
对你的问题一个简单的解决方案是使用LINQ的方法OrderBy
随机数:
string chars = "AABBCCDDEEFFGGHHIIJJKKLL";
Random random = new Random();
var shuffled = chars.OrderBy(c => random.Next(chars.Length));
string finalString = new string(shuffled.ToArray());
Console.WriteLine(finalString);
有时您可能会看到人们使用Guid
而不是随机数:
string chars = "AABBCCDDEEFFGGHHIIJJKKLL";
var shuffled = chars.OrderBy(c => Guid.NewGuid());
string finalString = new string(shuffled.ToArray());
Console.WriteLine(finalString);