将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次,这是一个很大的数字,所以我如何洗牌来减少它?
_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
只能是0
或1
。
不要这样做,而是使用潜在交换候选者的整个范围:
int k = (box[0] % _dominoes.Count);