首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在列表c#中混洗Domino棋子

在列表c#中混洗Domino棋子
EN

Stack Overflow用户
提问于 2015-08-12 02:32:47
回答 2查看 228关注 0票数 1

我有Domino类

代码语言:javascript
复制
public Class Domino(){
   public int SideA{get;set;}
   public int SideB{get;set;}
   public Domino(int sideA,int sideB){
      SideA = sideA;
      SideB = SideB;
}
}

和manager类,我在其中创建列表并对其进行混洗

代码语言:javascript
复制
   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个棋子到player类时,几乎每次都有4个相同的棋子(相同的我是指1/2,1/1,1/4,1/5,其中一个棋子数量与其他棋子相同)我尝试了1000次,但它做出了300次它是相当大的数字,所以我如何才能通过洗牌来减少它呢?

EN

回答 2

Stack Overflow用户

发布于 2015-08-12 03:00:34

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

票数 1
EN

Stack Overflow用户

发布于 2015-08-12 03:32:57

当您像这样进行混洗时:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
    int k = (box[0] % _dominoes.Count);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31949426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档