Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我用C语言创建了一个整数数组洗牌程序,但是。。。但它似乎重复了某个数字_C_Arrays_Shuffle - Fatal编程技术网

我用C语言创建了一个整数数组洗牌程序,但是。。。但它似乎重复了某个数字

我用C语言创建了一个整数数组洗牌程序,但是。。。但它似乎重复了某个数字,c,arrays,shuffle,C,Arrays,Shuffle,因此,作为C的一项任务,我需要创建一个纸牌游戏。当然,洗牌是代码的一个重要部分 我设计的牌组可以容纳52张牌(没有小丑),它们被标识为整数: 成百上千代表这套衣服,而十和一代表这张脸 我首先将这些数字按顺序插入到数据组中,然后用一个基本上从数组中的两个随机索引中获取数字并交换它们的代码将其洗牌。这是交换循环的一百万次 然而,由于一些奇怪的原因,在洗牌后,数字0(黑桃王牌)总是会在洗牌后出现两次。我编写了一个调试代码,当数组中的两个元素相同时会发出警报,并且总是0 我一遍又一遍地查看我的代码,似乎

因此,作为C的一项任务,我需要创建一个纸牌游戏。当然,洗牌是代码的一个重要部分

我设计的牌组可以容纳52张牌(没有小丑),它们被标识为整数:

成百上千代表这套衣服,而十和一代表这张脸

我首先将这些数字按顺序插入到数据组中,然后用一个基本上从数组中的两个随机索引中获取数字并交换它们的代码将其洗牌。这是交换循环的一百万次

然而,由于一些奇怪的原因,在洗牌后,数字0(黑桃王牌)总是会在洗牌后出现两次。我编写了一个调试代码,当数组中的两个元素相同时会发出警报,并且总是0

我一遍又一遍地查看我的代码,似乎找不到原因。我没有注意到C有什么特点吗

代码:

/*套装和面部图例:
套装
000-黑桃
100-三叶草
200-钻石
300-心脏
面孔
0-Ace
1 - 2
2 - 3
3 - 4
4 - 5
5 - 6
6 - 7
7 - 8
8 - 9
9 - 10
10-杰克
11-女王
12-国王
*/
#包括
#包括
#包括
#包括
#包括
#定义诉讼4
#定义面13
#定义卡52
#定义货币500
void debugPrintDeck();
静态整数组[卡片]//游戏中使用的甲板
int main(){
//变数
int cnt=-1;//跟踪牌组中有多少张牌,以及顶部的第n张牌。如果牌组中没有牌,则为-1。0索引。
srand(时间(0));
放置(“按顺序堆放甲板…”);
//在卡片组中按顺序放置卡片(第一步)
对于(int-crd=-1;crd<312;){//从第一个黑桃(000)开始到心脏(300)
crd++;//以Ace开头。
cnt++;//表示卡已添加到卡组中。
甲板[cnt]=crd;
如果(crd==12 | | crd==112 | | crd==212 | | crd==312)crd+=87;
}
debugPrintDeck();
放置(“\n正在进行中的填充…”);
//洗牌代码(第二步)
//包括将打印要切换的值的代码。
//还包括在不同索引中检测到相同数字时终止程序的代码。
对于(int-shfl=1;shfl<1000000;shfl++){
int rng1=-1;//初始化为不在数据组中的值。
int rng2=-1;
int temp1=-1;
int temp2=-1;
做{
rng1=rand()%53;
rng2=rand()%53;
}while(rng1==rng2);//确保值不会随机化到同一位置。
temp1=甲板[rng1];
temp2=甲板[rng2];
printf(“\ntemp1位于组[%d]=%d”,rng1,temp1);//调试
printf(“组[%d]=%d处的temp2”,rng2,temp2);//调试
甲板[rng2]=temp1;
甲板[rng1]=temp2;
如果(组[rng2]==组[rng1]){//debug
printf(“\n警报警报:rng1#%d为%003d,rng2#%d为%003d”,rng1,甲板[rng1],rng2,甲板[rng2]);
出口(0);
}
}
debugPrintDeck();
}
void debugPrintDeck(){
puts(“\n以下是从一端到另一端的完整卡片堆栈。”);
用于(int card=0;card<52;card++){
printf(“\ncard#%d=%003d”,卡片,卡片组[卡片];
}
}

注意:如果您想让程序完成洗牌并正确终止,只需删除第82行。

您使用的是?如果没有,您使用什么算法来确保没有偏差?这也回答了你的问题吗
rand()%53
将导致问题;它应该是
rand()%CARDS
。另外,你的甲板创建代码也很有趣…
| crd==312
没有任何作用。另请参见-以及上的“编写恐怖代码”博客链接。
/* Suit and Face legend:
 Suits
  000 - Spade
  100 - Clover
  200 - Diamond 
  300 - Heart
 Faces
   0 - Ace
   1 - 2
   2 - 3
   3 - 4
   4 - 5
   5 - 6
   6 - 7
   7 - 8
   8 - 9
   9 - 10
   10 - Jack
   11 - Queen
   12 - King
*/

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

#define SUITS 4
#define FACES 13
#define CARDS 52
#define MONEY 500

void debugPrintDeck();

static int deck[CARDS];//deck used in game

int main(){

    //Variables
    int cnt = -1; //Keeps track of how many cards there are in the deck, as well as the nth card on top. -1 if there's no card in the deck. 0 indexing.

   srand(time(0));

    puts("Stacking deck in order...");

    //PLACING CARDS IN ORDER IN DECK (First Step)
    for(int crd = -1; crd < 312;){//Starting from the first Spade (000) to Heart (300)
        crd++; //Starts with Ace.
        cnt++; //indicating a card has been added to the deck.
        deck[cnt] = crd;
        if(crd == 12 || crd == 112 || crd == 212 || crd == 312) crd += 87;
    }

    debugPrintDeck();

    puts("\nShuffling in progress...");

    //SHUFFLING CODE (Second Step)
    //Includes code that will print the values that switch.
    //Also include code that will terminate the program when it detects identical numbers in different indexes.
    for (int shfl = 1; shfl < 1000000; shfl++){
        int rng1 = -1; //initialize to a value not in the deck.
        int rng2 = -1;
        int temp1 = -1;
        int temp2 = -1;
        do{
            rng1 =  rand() % 53;
            rng2 =  rand() % 53;
        } while (rng1 == rng2); //ensures the values won't randomize into the same position.
        temp1 = deck[rng1];
        temp2 = deck[rng2];
        printf("\ntemp1 at deck[%d]= %d",rng1, temp1); //debug
        printf(" temp2 at deck[%d]=%d",rng2, temp2); //debug
        deck[rng2] = temp1;
        deck[rng1] = temp2;
        if (deck[rng2] == deck[rng1]) { //debug
          printf("\nALERT ALERT ALERT: rng1 #%d is %003d, rng2 #%d is %003d", rng1, deck[rng1], rng2, deck[rng2]);
          exit(0);
          }
    }

    debugPrintDeck();

}

void debugPrintDeck(){
    puts("\nThe following is the full stack of cards from end to end.");
    for (int card = 0; card < 52; card++){
        printf("\ncard #%d = %003d", card, deck[card]);
    }
}