C#索引号随机生成并放入数组中不再出现,仍然得到与该编号相同的结果

  • 本文关键字:编号 结果 再出现 随机 索引 不再 数组 c#
  • 更新时间 :
  • 英文 :

class Cards
{
    private Random random = new Random();
    private List<Card> playerDeck = new List<Card>();
    private List<Card> computerDeck = new List<Card>();
    private List<int> usedPlayerNrs = new List<int>();
    private List<int> usedComputerNrs = new List<int>();
    public enum Card
    {
        AceClubs = 11,
        AceDiamonds = 11,
        AceHearts = 11,
        AceSpades = 11,
        DeuceClubs = 2,
        DeuceDiamonds = 2,
        DeuceHearts = 2,
        DeuceSpades = 2,
        EightClubs = 8,
        EightDiamonds = 8,
        EightHearts = 8,
        EightSpades = 8,
        FiveClubs = 5,
        FiveDiamonds = 5,
        FiveHearts = 5,
        FiveSpades = 5,
        FourClubs = 4,
        FourDiamonds = 4,
        FourHearts = 4,
        FourSpades = 4,
        JackClubs = 11,
        JackDiamonds = 11,
        JackHearts = 11,
        JackSpades = 11,
        KingClubs = 13,
        KingDiamonds = 13,
        KingHearts = 13,
        KingSpades = 13,
        NineClubs = 9,
        NineDiamonds = 9,
        NineHearts = 9,
        NineSpades = 9,
        QueenClubs = 12,
        QueenDiamonds = 12,
        QueenHearts = 12,
        QueenSpades = 12,
        SevenClubs = 7,
        SevenDiamonds = 7,
        SevenHearts = 7,
        SevenSpades = 7,
        SixClubs = 6,
        SixDiamonds = 6,
        SixHearts = 6,
        SixSpades = 6,
        TenClubs = 10,
        TenDiamonds = 10,
        TenHearts = 10,
        TenSpades = 10,
        ThreeClubs = 3,
        ThreeDiamonds = 3,
        ThreeHearts = 3,
        ThreeSpades = 3
    }
    public void createDecks()
    {
        playerDeck = Enum.GetValues(typeof(Card)).Cast<Card>().ToList();
        computerDeck = Enum.GetValues(typeof(Card)).Cast<Card>().ToList();
        usedPlayerNrs = new List<int>();
        usedComputerNrs = new List<int>();
    }
    public Card getPlayerCard()
    {
        int index = random.Next(playerDeck.Count());
        usedPlayerNrs.Add(index);
        while (usedPlayerNrs.Contains(index))
        {
            index = random.Next(playerDeck.Count());
        }
        Card randomCard = playerDeck[index];
        return randomCard;
    }
    public Card getComputerCard()
    {
        int index = random.Next(computerDeck.Count());
        usedComputerNrs.Add(index);
        while (usedComputerNrs.Contains(index))
        {
            index = random.Next(computerDeck.Count());
        }
        Card randomCard = computerDeck[index];
        return randomCard;
    }
}

我需要从一副牌中得到一张牌,但我只被允许得到一次。但是,当我将随机生成的数字放入数组中以排除该数字再次出现时,我仍然会得到相同的卡片。已经尝试了很多,这就是为什么代码在这一点上有点混乱的原因。

变量

usedPlayerNrsusedComputerNrs将始终具有唯一值,但playerDeckcomputerDeck具有重复的值,并且您正在根据唯一索引获取卡,如下所示:

 Card randomCard = playerDeck[index]

因为,playerDeck有重复的值,你会多次得到同一张卡。

获得"相同结果"的原因是,您在枚举中为多个项目分配了相同的值。相反,请为每个项目指定一个唯一的值。

public enum Card
{
   AceClubs = 11,
   AceDiamonds = 12,
   AceHearts = 13,
   AceSpades = ...,
}

此外,您可以通过比较枚举项的名称(而不是分配给枚举项的值(来检查样本的唯一性。这样:

var propertyName = typeof(Card).GetEnumName(Card.AceClubs);

你在这里有一个错误:

public Card getPlayerCard(List<int> usedPlayerNrs, List<Card> playerDeck)
{
    int index = random.Next(playerDeck.Count());
    while (usedPlayerNrs.Contains(index))
    {
        index = random.Next(playerDeck.Count());
    }
    usedPlayerNrs.Add(index);//Only add your index to the userplayednumbers here!
    Card randomCard = playerDeck[index];
    return randomCard;
}

此外,查找洗牌算法,它将有助于以更有效的方式随机收集卡片。

如前所述,拥有多个具有相同值的枚举是一种代码异味。您确定不想将它们编号为 1-52 吗?或者选择面向对象的设计并添加一个数字 + 黑桃/钻石/...枚举到该类。