随机化字符串数组
本文关键字:数组 字符串 随机化 | 更新日期: 2023-09-27 18:34:56
编辑:这与随机数字无关。当我尝试这样做时,我得到的只是数字,而不是我的字符串。有人至少可以解释一下费舍尔-耶茨洗牌或它是什么,在我的情况下如何工作,如果它确实适用于句子字符串?因为我不明白..我不能是唯一一个不理解它的人吗?
我有一个想要随机化的字符串数组。我想要三个随机字符串,它们不一样,但我在网上找到的所有东西要么是数字,要么是另一种语言。目前我的字符串是随机的,但我有时会得到相同的字符串,例如:"在树后面,在树后面,在树后面"。
所以它应该像 randomHiding1 != randomHide 2 && randomHiding3;(我知道这不是"真正的代码",但只是为了让你明白我的意思(
这是我在这里的第一篇文章,所以我希望这个问题没问题,因为我找不到任何人问关于随机化"句子字符串"的问题,而不仅仅是"abcdefg...."或数字。这是我的代码。提前感谢!
Random random = new Random();
// strings with hiding spots
string[] hidingSpot = {
"in a ditch",
"up in a tree",
"behind a stone",
"in a hole in the ground",
"behind a tree",
"in the shadows" };
int hidingChoice1 = random.Next(hidingSpot.Length);
int hidingChoice2 = random.Next(hidingSpot.Length);
int hidingChoice3 = random.Next(hidingSpot.Length);
string randomHiding1 = hidingSpot[hidingChoice1];
string randomHiding2 = hidingSpot[hidingChoice2];
string randomHiding3 = hidingSpot[hidingChoice3];
顺便说一句,我知道这段代码非常糟糕,而且不必要地长,但我对数组和列表仍然相当陌生,所以我的首要任务是获取有效的代码,而不是短代码等。所以我不需要关于阅读文档的提示,因为我一直在这样做,但由于个人原因,我很难记住事情。我希望这是有道理的。
也许这会帮助你: 费舍尔-耶茨洗牌
一种使用 LINQ 的方法:
Random r = new Random();
string[] hidingSpot = "in a ditch|up in a tree|behind a stone|in a hole in the ground|behind a tree|in the shadows".Split('|');
hidingSpot = hidingSpot.OrderBy(x => r.Next()).ToArray();
string one = hidingspot[0];
string two = hidingspot[1];
string three = hidingspot[2];
最后:
正如Stefan Schmid在另一个答案中提到的,你可以实现Fisher-Yates Shuffle,又名Knuth Shuffle。这里提供了一个实现,我在下面复制粘贴,但所有功劳都归 Jodrell:
public static IEnumerable<T> Shuffle<T>(
this IEnumerable<T> source,
Random generator = null)
{
if (generator == null)
{
generator = new Random();
}
var elements = source.ToArray();
for (var i = elements.Length - 1; i >= 0; i--)
{
var swapIndex = generator.Next(i + 1);
yield return elements[swapIndex];
elements[swapIndex] = elements[i];
}
}
然后,您可以使用以下内容:
hidingSpot = hidingSpot.Shuffle().ToArray();
string one = hidingspot[0];
string two = hidingspot[1];
string three = hidingspot[2];