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
}
}