数组二十一点排序错误C编程

时间:2016-05-06 21:22:23

标签: c

我目前正在为我在C编程中的最终项目进行二十一点游戏。我有一个有效的基本程序,但我想让它更有吸引力,因为我有时间。我正试图让我的#34;从牌组中抽出一张牌"该计划的一部分比1 + rand() % 11两次更有趣,以拉两张牌。

我想拥有一组数字并从中提取一个随机数。 (简单)但是从来没有绘制相同的数字,在这种情况下,超过4次。要做到这一点,我想获得1到52之间的随机数,以获得"卡的位置标记"在数组中,并移动" card"到甲板的后面并减少你可以得到一个随机数的数量(e.x 1-51循环1-50循环1-49)

我认为我的错误是冒泡,但我可能错了。

int main(){

int deck[52] = {1,1,1,1,2,2,2,2,3,3,3,3,4,
                4,4,4,5,5,5,5,6,6,6,6,7,7,      //Array of cards
                7,7,8,8,8,8,9,9,9,9,10,10,
                10,10,10,10,10,10,10,10,10,
                10,11,11,11,11};


for(i=51;i>0;--i){
                                        //for loop to decrease value of i               
        srand(time(NULL));
        crd = rand() % i;               //the number - 1 every loop that becomces "crd"

    printf("%d\n",deck[crd]);

    deck[i+1] = temp;                   //bouble sort the card to the back of the deck
    deck[crd] = deck[i+1];
    deck[crd] = temp;

    }
}

我的出局如下 10 6 1 9 6 4 3 0 0 0 0 0 8 五 3 0 4 7 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 3 2 0 0 1 0 0 0 2 0 0 0 0

我的程序崩溃了。我无法确定代码有什么问题。请帮忙

2 个答案:

答案 0 :(得分:1)

您尝试模拟的算法是现代Fisher Yates shuffle

-- To shuffle an array a of n elements (indices 0..n-1):
for i from n−1 downto 1 do
  j ← random integer such that 0 ≤ j ≤ i
  exchange a[j] and a[i]

这段代码是你的清理了一下。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static int deck[52] = { 
  1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,3 ,3 ,3 ,3 ,4 ,
  4 ,4 ,4 ,5 ,5 ,5 ,5 ,6 ,6 ,6 ,6 ,7 ,7 ,
  7 ,7 ,8 ,8 ,8 ,8 ,9 ,9 ,9 ,9 ,10,10,10,
  10,10,10,10,10,10,10,10,10,11,11,11,11
};

void swap (int *a, int *b){
    int temp = *a; 
    *a = *b; 
    *b = temp;
}

int main(void) {
  //You only need to call srand once.
  srand(time(NULL));
  int i = 0;
  int j = 0;
  for(i = 51 ; i > 0; --i){
    j = rand() % i; 
    printf("%d\n",deck[j]);
    swap(&deck[j], &deck[i]);  
  }
  return 0;
}

这里重要的一点是i在整个数字范围内正在减少,即每个数字将与随机选择的数字交换。

答案 1 :(得分:0)

一些问题:

  • 您应该只是calling srand once
  • for循环将在循环的第一次迭代(i == 51deck[i+1])之外访问数组外部,并且永远不会触及元素0(最后一个元素)应该是1)。您可以将for (i = 51; i > 0; --i)更改为for (i = 50; i >= 0; --i)
  • 来解决此问题
  • 交换错误。 deck[i+1] = temp;应为temp = deck[i+1];

交换通常如下所示:

// to swap a and b
int t;
t = a;
a = b;
b = t;

这不是一个“语法”,而是一个如何交换两个变量的约定。例如,惯用交换在Python中看起来像a, b = b, a