随机化字符串数组

时间:2016-02-17 14:31:36

标签: c# arrays string random

编辑:这与随机数字无关。当我尝试这样做时,我所得到的只是数字,而不是我的字符串。有人至少可以解释一下Fisher-Yates-shuffle或者它是什么,如果它确实适用于句子字符串,那么我的情况会如何?因为我不理解它......我不能成为唯一一个不理解它的人吗?

我想要随机化一系列字符串。我想要三个随机字符串,它们不相同,但我在网上找到的所有内容都是数字或其他语言。目前我的字符串是随机的,但我有时会得到相同的字符串,例如:"在树后面,在树后面,在树后面"。

所以它应该像randomHiding1!= randomHiding 2&& randomHiding3; (我知道那不是"真正的代码",但只是让你理解我的意思)

这是我在这里的第一篇文章,所以我希望可以提出这个问题,因为我还没有找到任何人提出关于随机化的问题"句子 - 字符串",而不仅仅是& #34; 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];
顺便说一句,我知道这段代码非常糟糕,而且不必要很长,但我对数组和列表还是比较新的,所以我的首要任务是获得有效的代码,而不是短代码等。因此,我不需要阅读文档的提示,因为我经常这样做,但由于个人原因,我很难记住事情。我希望这是有道理的。

2 个答案:

答案 0 :(得分:0)

也许这可以帮到你:Fisher-Yates Shuffle

答案 1 :(得分:0)

使用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 a.k.a 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];