gpt4 book ai didi

不能为每个元素洗牌一次

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:53 25 4
gpt4 key购买 nike

我正在尝试编写一个代码,将每个元素至少打乱一次,但它对我不起作用。


我试过的代码是:

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

void show(int[],int);

void shuffle(int[],int,int*);

int main (void)
{
int karten[]={1,2,3,4,5,6,7,8,9,10};
int n = sizeof(karten)/sizeof(int);
int s=0;
srand(time(NULL));
printf("Karten vor dem Mischen: \n");
show(karten,n);
shuffle(karten,n,&s);
printf("Karten nach dem Mischen:\n");
show(karten,n);
return 0;
}
void show(int karten[],int n)
{
for(int i=0;i<n;i++)
{
printf("%d,",karten[i]);
}
printf("\n");
}
void shuffle(int karten[],int n,int *s)
{
int i=0;
int d=0;
int vi;
int vd;
int q;
*s=0;
int *v=(int*)malloc(sizeof(int)*n);
q=0;
while(1)
{
i=rand()%10;
d=rand()%10;
vi=karten[i];
vd=karten[d];
karten[d]=vi;
karten[i]=vd;
*s=*s+1;
v[i]=1;
v[d]=1;
for(int b=0;b<=n;b++)
{
if(v[b]==1)
{
q++;
}
}
if(q==n)
{
break;
}
}
printf("Es wurden %d Vertauschungen gemacht\n",*s);
free(v);
}

错误是代码有时能用,有时不能用。当它工作时,我认为它不能正常工作,因为洗牌时间是 (3) 或 (4)。我试图让它尽可能简单。


最佳答案

存在三个问题。

首先是您没有初始化 v分配内存后。您应该将所有值设置为 0 或只使用 calloc这将为您做到这一点。

第二个在 for 中循环检查是否所有牌都已洗牌:

for(int b=0;b<=n;b++)

你的数组索引 b范围从 0n ,但是因为数组有 n元素,有效索引为 0n-1 .所以改变<=< :

for(int b=0;b<n;b++)

第三个是在你使用q .您应该将其初始化为 0while 的开头循环,而不是在你输入之前。否则,您会将上一次运行的混洗元素计数添加到当前计数。

例如,假设在第一次迭代中 i是 2 和 d是 3。那么将交换 2 个元素。您将增加 q到 2,所以现在 q等于 2。现在假设在下一次迭代中 i是 4 和 d是5,一共交换了4个元素。所以你递增 q 4次。但是q的值为 2从上次迭代开始,所以现在 q6 .又一次迭代,q将至少为 12。因此条件 q==n永远不会遇见。

关于不能为每个元素洗牌一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34995627/

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