将Domino stones放入列表c#中

本文关键字:列表 Domino stones | 更新日期: 2023-09-27 18:07:18

我有Domino类

public Class Domino(){
   public int SideA{get;set;}
   public int SideB{get;set;}
   public Domino(int sideA,int sideB){
      SideA = sideA;
      SideB = SideB;
}
}

和管理器类,我在其中创建它的列表并打乱它的

   public class Manager{
       private List<Domino> _dominoes = new List<Domino>();
       private void CreateDomino(){
       for(int i=0;i<7;i++){
          for(int j=i;j<7;j++){
          _dominoes.Add(new Domino(i,j));
    }
    }
     }
       private void Shuffle(){
           RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
    int n = _dominoes.Count;
    while (n > 1)
    {
        byte[] box = new byte[1];
        do provider.GetBytes(box);
        while (!(box[0] < n * (Byte.MaxValue / n)));
        int k = (box[0] % n);
        n--;
        T value = _dominoes[k];
       _dominoes[k] = _dominoes[n];
        _dominoes[n] = value;
    }
}
    }

}

洗牌方法效果很好,它将多米诺骨牌列表随机化,但问题是,当我将前7块石头发送给玩家类时,几乎每次都有4块相同的石头(我的意思是,例如1/2、1/1,1/4、1/5,其中一块石头的数量与其他石头的数量相同(。我尝试了1000次,结果是300次,这是一个很大的数字,所以我如何洗牌来减少它?

将Domino stones放入列表c#中

List类基于Array。因此,它接受数组访问器[]。您可以创建一个从0到_dominoes.Count -1的整数数组,并对其进行随机化,然后遍历访问_dominoes[MyIndexValue]的数组,而不是对列表进行混洗(这有点耗费资源(,然后遍历列表。然后,您只是将一个值类型(整数(数组随机化,您的多米诺骨牌列表永远不会改变。

当你像这样洗牌时:

int n = _dominoes.Count;
while (n > 1)
{   ...
    int k = (box[0] % n);
    n--;
    T value = _dominoes[k];
   _dominoes[k] = _dominoes[n];
    _dominoes[n] = value;
}

你在列表开头的部分只能与列表开头的其他部分交换。

例如,如果n = 2,则k = box[0] % 2只能是01

不要这样做,而是使用潜在交换候选者的整个范围:

    int k = (box[0] % _dominoes.Count);