gpt4 book ai didi

c - rand() 第一次返回相同的值

转载 作者:行者123 更新时间:2023-12-01 23:49:11 25 4
gpt4 key购买 nike

首先,这是我的代码:

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

#define NUM_SUITS 4
#define NUM_RANKS 13

bool in_hand[NUM_SUITS][NUM_RANKS] = {false};
bool newcard = {false};
int num_cards, rank, suit, totrank;
const char rank_code[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K',};
const char suit_code[] = {'C','D','H','S'};

int main_hand ()
{
suit = rand() % NUM_SUITS;
rank = rand() % NUM_RANKS;
if (!in_hand[suit][rank]) {
in_hand[suit][rank] = true;
num_cards--;
if (suit == 0){
printf("%c of Clubs \n", rank_code[rank]);
}
else if (suit == 1){
printf("%c of Diamonds \n", rank_code[rank]);
}
else if (suit == 2){
printf("%c of Hearts \n", rank_code[rank]);
}
else if (suit == 3){
printf("%c of Spades \n", rank_code[rank]);
}
}
}

int print_hand (suit)
{

}

int totrank_check (totrank)
{
if (totrank > 21) {
printf ("You lose!");
}
else if (totrank == 21) {
printf ("You win!");
}
}

int main()
{
bool stay = {false};
srand((unsigned) time(NULL));

totrank = 0;
num_cards = 2;
printf("Your hand: ");
while (num_cards > 0) {
main_hand();
totrank = totrank + (rank + 1);
}
printf("Total rank: %d\n", totrank);
totrank_check(totrank);
printf("\n");
while (totrank < 24 && stay == false) {
printf("Another card? 1. Yes 0. No\n");
scanf("%d", &newcard);
if(!newcard) {
main_hand();
}
totrank = totrank + (rank + 1);
totrank_check(totrank);
printf("Total rank: %d\n", totrank);
printf("Stay? 1. Yes 0. No\n");
scanf("%d", &stay);
}
return 0;
}

基本上它是一个“模拟”二十一点牌的代码。它开始,rand() 选择两个数字,牌的等级和花色,它们在矩阵中设置为真,这样它们就不能在相同的组合中再次被选择,然后打印.检查卡片的总等级(如果超过 21,您将自动输),然后系统会询问您是要另一张卡片还是要留下来。

这是一个错误:如果您选择要另一张卡片,那么这张新卡片将与上一张相同。基本上,您得到一张黑桃 A、方 block 2 和方 block 2,然后您想要另一张牌,又得到方 block 2。另一个,另一个。如果你在第二个中移除排名检查,你可以看到排名根据最后一张牌的排名增长。

之前,printfs 位于 print_hand() 函数中,您可以看到您总是得到相同的卡片,现在我将它们移到了 main_hand() 中函数,因为我认为这可能是问题所在(事实并非如此),并且因为有一个单独的打印函数是多余的。但是从技术上讲,你可以看到 if(!in_hand[suit][rank]) 有效,因为,由于卡是相同的,所以它不会进入 if 并且不会得到打印出来。

我不知道是什么导致了这个问题。有什么想法吗?

请注意,我已经在使用 srand((unsigned) time(NULL));rand() 播种。

最佳答案

scanf("%d", &newcard);scanf("%d", &stay); 是个问题,因为变量是 bool,但格式说明符用于 int。在 2 个地方,更改为:

// scanf("%d", &newcard);
int t;
scanf("%d", &t);
newcard = !!t;

3 个函数返回 int 但不返回任何内容。更改为 void 函数。

// int main_hand() {
void main_hand() {

似乎还有其他逻辑问题。
1) 代码有时存在不知道输赢
2) @Jongware 上面的评论正确:

最后:如果仍然出现相同的随机序列,将代码剥离为裸main srand time printf rand,看看是否可行。 time(),如果不工作总是返回-1。
或者简单地添加以下内容并验证使用不同值调用的 srand()

 int main(void) {
unsigned now = (unsigned) time(NULL);
printf("now = %u\n", now);
srand(now);

关于c - rand() 第一次返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27411492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com