列表c#中的多米诺骨牌洗牌

时间:2015-08-11 18:32:47

标签: c#

我有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;
    }

}
    }


}

shuffle方法工作得很好随机化多米诺骨牌列表但问题是,当我将前7个石头发送到玩家类时,几乎每次都有4个相同的石头(我的意思相同,例如1/2,1 / 1,1 / 4,1 / 5,其中一个石头数与其他石头数相同一个)我尝试了1000次,它做了300次这是相当大的数字,所以我怎么能将它改组以减少它?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

当你像这样进行洗牌时:

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

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

E.g。如果n = 2然后k = box[0] % 2只能是01

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

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