嗨,伙计们,我不知道为什么我的洗牌不洗牌。我没有得到一个错误,但它不是洗牌,但当我面纱打印我的列表时,它出来排序,而不是洗牌。有人能告诉我问题出在哪里吗?我应该把我的shuffle放在我的链接列表中,而不是吗
我的包裹/套票:
namespace BlackJack
{
class Bundle
{
//private List<Card> deck1;
GameLinkedList<Card> deck = new GameLinkedList<Card>();
public void Shuffle()
{
for (int index = 0; index > 52; index++)
{
Random r = new Random();
int count = deck.Count();
for (int i = 0; i < count; i++)
{
int rnd = (int)(r.Next(count));
deck.AddLast(deck.Delete(rnd));
}
}
}
public void view()
{
deck.Print();
}
}
}
我的链接列表:
namespace BlackJack
{
class GameLinkedList<T> where T : IComparable
{
private Node<T> head;
private Node<T> temp;
private int count = 0;
public void Clear()
{
head = null;
count = 0;
}
public void Delete(T t)
{
Node<T> prev = temp;
temp = head;
while (temp != null)
{
if (t.CompareTo(temp.data) == 0)
{
prev.next = temp.next;
temp = null;
}
else
{
prev = temp;
temp = temp.next;
}
}
count--;
}
public T Delete(int i)
{
Node<T> prev = temp;
temp = head;
while (temp != null)
{
if (i.CompareTo(temp.id) == 0)
{
prev.next = temp.next;
count--;
return temp.data;
}
else
{
prev = temp;
temp = temp.next;
}
}
return temp.data;
}
public void AddLast(T t)
{
if (head == null)
{
head = new Node<T>();
head.data = t;
head.next = null;
}
else
{
Node<T> n = new Node<T>();
n.data = t;
Node<T> current = head;
while (current.next != null)
{
current = current.next;
}
current.next = n;
}
count++;
}
public int Count()
{...}
public void Print()
{
temp = head;
while (temp != null)
{
Console.WriteLine(temp.data.ToString());
temp = temp.next;
}
}
}
}
如果没有一个好的、最小的、complete代码示例来可靠地再现问题,就不可能识别代码中的最后一个问题。然而,仅在Shuffle()
方法中就存在许多明显的问题:
- 您的循环继续条件是
index > 52
。由于index
从0开始,表达式index > 52
立即为false,因此循环根本不会执行 - 您在外循环的每次迭代中都会分配一个新的
Random
对象。这几乎总是一个错误,因为代码执行得太快,以至于每个新的Random
对象都将以相同的种子开始,从而返回相同的数字序列 - 你完全有外环。内部循环应该足够用于此实现的目的。也就是说,对于牌组中的牌数,内环将随机选择一张牌并将其移动到最后。这不是一个好的洗牌,但至少在理论上可能会混淆牌。添加外循环可能会稍微增加熵(如果修复了
Random
错误),但这样做只会增加实现的效率
在我看来,您可以通过一些小的更改来显著改进当前的实现:
public void Shuffle()
{
Random r = new Random();
int count = deck.Count();
for (int i = 0; i < count; i++)
{
int rnd = (int)(r.Next(count--));
deck.AddLast(deck.Delete(rnd));
}
}
换言之,不要在意外循环,在选择新卡时,不要包括之前选择的任何卡。通过每次迭代递减count
,这将限制将要放置在末尾的卡的选择范围为尚未选择的卡。