从字符串列表生成随机唯一项

时间:2019-04-13 12:47:17

标签: c# random

我有一副纸牌的字符串列表,例如A-DIAMONDS,2-CLUBS等。

我希望能够从此列表中随机生成5个唯一项。

我知道如何在Python中使用Random.sample(5)做到这一点,但是试图在C#中找到解决方案。一切似乎都在生成一个随机数,将其放入列表中,生成另一个随机数,对照列表进行检查,然后一切正常。

在C#中是否有更紧凑的方法?

这是使用Linq改组后的完整代码。

    class Program
{
    static void Main(string[] args)
    {
        string [] cardValues = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
        string [] cardSuites = { "HEARTS", "CLUBS", "DIAMONDS", "SPADES" };
        List<string> deckOfCards = new List<string>();

        foreach(string cardsuit in cardSuites)
        {
            foreach(string cardvalues in cardValues)
            {
                deckOfCards.Add(cardvalues + "-" + cardsuit);
            }

        }

        for(int i = 0; i <= 10; i++)
        {
            List<string> pokerHand = new List<string>();
            Random rand = new Random();
            deckOfCards = deckOfCards.Select(x => new { card = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.card).ToList();
            for(int x = 0; x < 5; x++)
            {
                pokerHand.Add(deckOfCards[x]);
            }
            Console.WriteLine(String.Join(", ", pokerHand));
        }


        Console.ReadLine();
    }
}

}

3 个答案:

答案 0 :(得分:3)

这是使用linq进行洗牌的一种方法。 5张随机卡是列表中的前5个项目。 :

    class Program
    {
        static void Main(string[] args)
        {
            List<string> deck = new List<string>() {
                "S2", "S3", "S4", "S5", "S6", "S7", "S8", "S9", "ST", "SJ", "SQ", "SK", "SA",
                "H2", "H3", "H4", "H5", "H6", "H7", "H8", "H9", "HT", "HJ", "HQ", "HK", "HA",
                "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CT", "CJ", "CQ", "CK", "CA",
                "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DT", "DJ", "DQ", "DK", "DA"
            };

            Random rand = new Random();

            deck = deck.Select(x => new { card = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => x.card).ToList();
        }
    }

答案 1 :(得分:1)

您可以使用MoreLINQ。只需从NuGet安装它。 MoreLINQ为您提供了Shuffle方法。因此,您可以执行以下操作:

List<Card> deck = GetDeck();
List<Card> randomFiveCards = deck.Shuffle().Take(5).ToList();

答案 2 :(得分:0)

有效且有效的算法是在0n-1之间选择一个随机索引(其中n是纸牌数),然后用该索引处的纸牌交换最后一张纸牌。然后在0n-2之间选择一个随机索引,并用该索引处的第二张卡交换倒数第二张卡。

n-3n-4n-5重复其他三遍,随机选择的五张卡片将位于数组的末尾。

相关问题