有人可以告诉我如何随机化一组结构。 我在线搜索并看过很多关于randomsize数组的教程。 但我不认为他们在我的场景中工作......
我一直收到错误.exe停止工作.....
我认为问题来自
card[i] = i + 1;
card[i] = card[j];
card[j] = temp;
有人可以帮助我使用我的代码,我正在尝试随机化/随机播放阵列卡[]。例如:
卡[0]是Ace 心 红色 卡[1]是两个 心 红色 ... 等等 我希望他们成为 card [0]现在是其他卡片。struct Cards
{
int suits;
int values;
int colour;
};
struct Cards card[52];
void printcard();
void filldeck(); /* Populates a deck of cards */
void printdeck();
void shuffle();
int main()
{
/* code */
printcard();
filldeck();
printdeck();
shuffle();
printdeck();
return 0;
}
void shuffle()
{
printf("%s\n\n", "---------------------- Shuffling deck ----------------------");
int i=0;
int j=0;
int temp=0;
int card[52];
srand(time(NULL));
for (i=0;i<52;i++)
{
j = (rand()%51) + 1;
temp = card[i];
card[i] = card[j];
card[j] = temp;
}
return;
}
答案 0 :(得分:2)
你有这些陈述:
int i,j,temp;
int card[i];
但您尚未初始化i
。因此,您不知道数组card
将具有多少元素,并且程序的行为将未定义,可能会导致分段错误。如果您希望数组包含52
个元素,请将i初始化为:
int i = 52;
然后声明:
int card[i];
但实际上 ,您想要随机播放的数组是全局数组struct Cards card[52]
,而不是{{1}中定义的数组cards
(参见this link关于变量&#39;范围)。因此,请尝试删除以下代码行:
shuffle
并查看结果是否符合预期。
答案 1 :(得分:1)
此代码存在许多问题。
正如Marievi所说,这一行
int card[i];
应该是
int card[52];
因为我在那时未被初始化(如果您编译时启用了大量警告,则会发现错误。如果您使用的是gcc,请使用-Wall
进行编译。
这一行
j = (rand()%51) + 1;
实际上给你一个1到51之间的伪随机数,不包括0和51,我认为这是你想要的,因为它应该是数组的索引。
最重要的是,你正在洗牌的阵列不是带有卡片的阵列。应该是int card[52];
的行定义了一个新的本地数组,该数组仅在函数返回之前存在,然后被丢弃。它&#34;阴影&#34;功能期间的全局卡阵列。如果你删除它并摆脱
for (i=0;i<52;i++)
{
card[i] = i + 1;
}
您将发现您的全局卡阵列已被洗牌。
还有一件事:您不需要将卡片的颜色放在Card
结构中。颜色由套装编码。心和钻石都是红色的;俱乐部和黑桃都是黑色的。
答案 2 :(得分:0)
除了已经给出的答案外,为了随机化一包卡片,请注意以下事项: 在函数'shuffle'中,您创建了一个本地数组'card';这会使'struct Cards'类型的全局数组'卡'黯然失色。 您需要做的是在您的随机播放功能中使用全局“卡”而不是本地“卡”。 局部int数组'card'仅在shuffle()内具有生命和可见性。
HTH,Swanand