【问题标题】:Randomising array of strings [duplicate]随机化字符串数组[重复]
【发布时间】:2016-02-17 14:31:36
【问题描述】:

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

我有一个要随机化的字符串数组。我想要三个不一样的随机字符串,但我在网上找到的所有内容都是数字或另一种语言。目前我的字符串是随机的,但有时我会得到相同的字符串,例如:“在树后面,在树后面,在树后面”。

所以它应该像 randomHiding1 != randomHiding 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];

顺便说一句,我知道这段代码非常糟糕,而且过长,但我对数组和列表还是很陌生,所以我的第一要务是获得有效的代码,而不是短代码等。所以我不需要有关阅读文档的提示,因为我经常这样做,但是由于个人原因,我很难记住 atm 的内容。我希望这是有道理的。

【问题讨论】:

  • 哦,看,这是我对副本的回答。 stackoverflow.com/a/7913534/659190
  • 但那些是数字?它仍然工作吗?因为当我尝试类似的事情时,我得到的只是随机数,而不是我的字符串。
  • @paupau 阅读generics。泛型意味着无论你是随机化字符串、整数、日期还是其他任何东西,答案都不会改变。
  • 就像我在文本中写的那样,我无法很好地记住/理解文档。它太重了。我认为有人可以用“正常”的词简单地解释一下,而不是像文档那么复杂?
  • @paupau 尝试提供答案中的代码。你会发现你可以传入一个字符串数组——当你这样做时,编译器会将方法中的T类型替换为string。然后,您可以从随机数组中取出前 n 个项目。还有很多其他关于泛型的教程值得一读。

标签: c# arrays string random


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    一种使用 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];
    

    【讨论】:

    • 谢谢!!要求对 Shuffle 进行解释是否太过分了?我很难理解所有的 IEnumerable、、生成器、源和元素以及 swapIndex 等。这比我能做的和理解 atm 的要复杂一些,我真的很想理解它!
    • @paupau 参见维基百科文章的this part
    • 我现在尝试了您的第一种方法,但没有奏效。然后我尝试了使用 LINQ 的第二种方法,这似乎有效。不过,我不明白怎么做。这部分有什么作用?其他一切我都明白。我知道我们最后将它“更改”为一个数组,但是 x 和箭头以及 orderBy 做什么?hidingSpot.OrderBy(x => r.Next()).ToArray();
    • @paupau 怎么没用?我的意思是,你如何断定它是错误的?
    • 我尝试了大约 10 次,有时它可以工作,但有几次我得到了相同的答案,例如“在阴影中,在树后,在树后”,甚至所有三者相同。而对于第二种方法,我现在已经尝试了大约 20 次,而且它从来没有重复过,所以到目前为止,它似乎正在工作。我不知道还有什么办法检查它。
    猜你喜欢
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2020-01-12
    相关资源
    最近更新 更多