1

我一直在玩弄/研究随机化字符串中字符顺序的方法。坦率地说,我只是不明白该怎么做。我搜索了 C# 文档和一些网站。我发现了一种随机化字符串中字符顺序的特殊方法,但我不明白它是如何工作的。我还读到 Random 类并不是真正随机的,这可以解释为什么结果如此相似。

我正在使用的当前方法究竟是如何起作用的(尤其是 OrderBy() 方法)。有一个更好的方法吗?

当前代码

string baseList = "abcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        string[] randLists = new string[baseList.Length];
        for (int i = 0; i < baseList.Length; i++)
        {
            randLists[i] = new string(baseList.ToCharArray().OrderBy(s => (random.Next(2) % 2) == 0).ToArray());
            Console.WriteLine(randLists[i]);
        }
        Console.Read();

这是我随机化的尝试,但它根本不起作用:

*string bL = "abcdefghijklmnopqrstuvwxyz";
            string[] rL = new string[bL.Length];
            Random randomizer = new Random();
            for (int i = 0; i < bL.Length; i++)
            {
                rL = new string(bL.ToCharArray().OrderBy(c => (randomizer.Next(0, 25)).ToString()));
            }*

提前感谢您的任何帮助。期间我会继续研究。

4

3 回答 3

5

尽管您找到的代码很短,但它并没有很好地分布原始字符串:随机化器可能会在生成 shuffle 的过程中为您提供相同的数字,从而增加相应字符保留在与原始字符串中的相对顺序相同。

这个问题的一个解决方案是使用Fisher-Yates shuffle。它很容易实现(不过,您需要远离常见的实现错误)。

由于string它是不可变的,因此您需要对字符数组进行洗牌,然后从中生成一个string

于 2013-10-08T01:48:39.930 回答
1

为了增加 Fisher-Yates shuffle 的建议,这里有一个代码示例,只需忽略测试断言,只是尝试调试并确保它足够随机。

[TestMethod]
        public void RandomizeText()
        {
            string baseList = "abcdefghijklmnopqrstuvwxyz";
            char[] result = baseList.ToCharArray();
            Shuffle<char>(result);
            var final = string.Join("", result);
            final.Should().NotMatch(baseList);

        }
    public void Shuffle<T>(T[] array)
    {
        var random = new Random();
        for (int x = 0; x < 100; x++)
        {
            for (int i = array.Length; i > 1; i--)
            {
                // Pick random element to swap.
                int j = random.Next(i); // 0 <= j <= i-1
                // Swap.
                T tmp = array[j];
                array[j] = array[i - 1];
                array[i - 1] = tmp;
            }
        }
    }
于 2013-10-08T02:10:56.890 回答
0

另一个例子...

    static void Main(string[] args)
    {
        string baseList = "abcdefghijklmnopqrstuvwxyz";
        Console.WriteLine(baseList);
        string shuffled = Shuffle(baseList);
        Console.WriteLine(shuffled);
        Console.ReadLine();
    }

    static Random R = new Random();

    static string Shuffle(string list)
    {
        int index;
        List<char> chars = new List<char>(list);
        StringBuilder sb = new StringBuilder();
        while (chars.Count > 0)
        {
            index = R.Next(chars.Count);
            sb.Append(chars[index]);
            chars.RemoveAt(index);
        }
        return sb.ToString();
    }
于 2013-10-08T03:57:11.243 回答