我有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次这是相当大的数字,所以我怎么能将它改组以减少它?
答案 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
只能是0
或1
。
不要这样做 - 而是使用潜在交换候选人的整个范围:
int k = (box[0] % _dominoes.Count);