我有Domino类
public Class Domino(){
public int SideA{get;set;}
public int SideB{get;set;}
public Domino(int sideA,int sideB){
SideA = sideA;
SideB = SideB;
}
}和manager类,我在其中创建列表并对其进行混洗
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次它是相当大的数字,所以我如何才能通过洗牌来减少它呢?
发布于 2015-08-12 03:00:34
List类基于一个数组。因此,它接受数组访问器[]。您可以创建一个从0到_dominoes.Count -1的整数数组并随机化,然后遍历访问_dominoes[MyIndexValue]的数组,而不是打乱列表(这有点耗费资源),然后遍历列表。然后,您只需随机化一组值类型(整数),而您的多米诺骨牌列表永远不会改变。
发布于 2015-08-12 03:32:57
当您像这样进行混洗时:
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,只能为0或1。
不要这样做-取而代之的是,使用潜在的交换候选的整个范围:
int k = (box[0] % _dominoes.Count);https://stackoverflow.com/questions/31949426
复制相似问题