甲板并没有打乱链表



嗨,伙计们,我不知道为什么我的洗牌不洗牌。我没有得到一个错误,但它不是洗牌,但当我面纱打印我的列表时,它出来排序,而不是洗牌。有人能告诉我问题出在哪里吗?我应该把我的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()方法中就存在许多明显的问题:

  1. 您的循环继续条件是index > 52。由于index从0开始,表达式index > 52立即为false,因此循环根本不会执行
  2. 您在外循环的每次迭代中都会分配一个新的Random对象。这几乎总是一个错误,因为代码执行得太快,以至于每个新的Random对象都将以相同的种子开始,从而返回相同的数字序列
  3. 你完全有外环。内部循环应该足够用于此实现的目的。也就是说,对于牌组中的牌数,内环将随机选择一张牌并将其移动到最后。这不是一个好的洗牌,但至少在理论上可能会混淆牌。添加外循环可能会稍微增加熵(如果修复了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,这将限制将要放置在末尾的卡的选择范围为尚未选择的卡。

相关内容

  • 没有找到相关文章

最新更新