随机数生成器,在范围内选择3,在某些迭代中返回2组

use*_*137 4 c# linq

我使用Linq将一个随机数生成器放在一起。在这种情况下,这些随机数的范围必须为1-6(含1-6)。我想选择3个不同数字组成的组。

我不明白为什么这段代码会返回仅包含2个数字的组。

        do
        {
            Random rnd = new Random();
            int[] myRndNos = Enumerable
                .Range(1, 6)
                .Select(i => rnd.Next(1, 7))
                .Distinct()
                .Take(3)
                .ToArray();                    

            string test = string.Join(",", myRndNos);

            System.Console.WriteLine(test);
            Console.ReadKey(true);
        } while (true); 
Run Code Online (Sandbox Code Playgroud)

它返回一个示例,如:

4,6,1
5,2,3
2,4,5
3,2
3,5,1
etc...
Run Code Online (Sandbox Code Playgroud)

为什么在某些情况下只取两个数字?对我来说没有意义。发射

Dan*_*iel 5

您正在生成6个随机数,但是如果这些数字恰好是重复的,则唯一性将消除它们,从而仅留下唯一值列表,如果只有2个唯一项,那么您将获得全部。

因为您想要3个不同的数字,所以我认为您所追求的是洗牌。

private static Random rnd = new Random(); 

int[] myRndNos = Enumerable.Range(1, 6).OrderBy(i => rnd.Next()).Take(3).ToArray();
Run Code Online (Sandbox Code Playgroud)

要么

private static Random rng = new Random(); 

int[] myRndNos = Enumerable.Range(1, 6).Shuffle();

public static void Shuffle<T>(this IList<T> list)  
{  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}
Run Code Online (Sandbox Code Playgroud)

算法来源:将List <T>随机化

  • 您已经确定了答案,但是我建议您这样做以改组-`int [] myRndNos = Enumerable.Range(1,6).OrderBy(i =&gt; rnd.Next())。Take(3) ToArray();`-它没有偏见,比传统的随机播放算法更容易理解。 (2认同)