typedef enum {Clubs = 1, Diamonds, Hearts, Spades} suit_t;
typedef enum {Ace = 1, Two = 2, Three = 3, Four = 4, Five = 5,
              Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10,
              Jack = 11, Queen = 12, King = 13} face_t;

typedef struct card_t
{
        suit_t suit;
        face_t face;
} card;

typedef struct stack_t
{
    struct card_t deck[53];
    int size;
} stack_h;

void shuffle_deck(stack_h *stack)
{
   stack_h temp, *cardptr;
   int i,num;

   for(i = 0; i < stack->size; i++)
   {
    i = rand() %stack->size;
    *cardptr = *stack;
    temp = *cardptr;
    *cardptr = *stack;
    *stack = temp;
   }
}


因此,我尝试了许多种方法来使我的牌组改组,但是不幸的是,我没有运气,我想做的就是很好地改组它编译的牌组,但是当它改组牌组时会出现分段错误。关于如何解决它的任何想法?除改组功能外,其他所有功能均有效。

最佳答案

首先考虑算法。有多种执行随机播放的方法,但是一种常见的技术(Fisher-Yates)是:


如果剩下的少于两个元素,则请停止。
从剩余的要洗牌的池中选择一个随机元素,然后将其与池中的最后一个元素交换。
将池的大小减小一倍,然后返回到步骤1。


在C中的实现可能是这样的:

void shuffle_deck(stack_h *stack)
{
   int last;

   for (last = stack->size - 1; last > 0; last -= 1)
   {
      int i = rand() % (last + 1);

      if (i < last) {
          card_t temp = stack->deck[i];
          stack->deck[i] = stack->deck[last];
          stack->deck[last] = temp;
      } // else the chosen element is already in the target position
   }
}

10-07 17:02