-1

所以我要做的就是从用户那里输入要使用多少张卡片,然后将每张卡片随机分配给数组中的不同索引。我在让 rand 函数正常工作时遇到很多问题。我已经阅读了足够多的内容,找到了多种不同的方式来对数组中的元素进行混洗,以发现这种方式在避免重复方面是最简单的。我正在使用 GCC,在输入卡片数量后,我永远不会从数组中取回值,如果我这样做,它们都是非常大的数字。任何帮助,将不胜感激。

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

void main(){
    srand(time(NULL));
    int d, c, i, z, l, r;
    printf("Enter the deck length: ");
    scanf("%d\n ", &c);
    int deck[c];
    int swap[c];
    z = c;
    for(l=0; l<c; l++){
            swap[l] = l;
            }
    for(i=z; i=0; i--){
            r = rand() / i 
            deck[i] = swap[r];
                    for(r; r=(c-1); r++){   
                    swap[r] = swap[(r+1)];
                    }
            }
    for(d = 0; d < c; d++){
            printf("%d ", deck[d]);
            }
    return;
    }
4

2 回答 2

0

我可以在这里发现一个主要问题:

for(i=z; i=0; i--)
         ^^^

这个循环永远不会执行,因为你正在使用 assignment( =) 并且设置i0因此条件将始终为false,尽管在这种情况下使用 equal( ==) 仍然为false,你可能想要:

for(i=z; i!=0; i--)

这意味着您将使用undefined behaviordeck未定义行为。修复后,您会在这里遇到类似的问题:

for(r; r=(c-1); r++){  

main必须返回int,你return最终需要提供一个价值。

打开警告应该可以让您找到大多数这些问题,例如使用-Wallwithgcc给我以下两个for循环的警告:

警告:建议在赋值周围使用括号作为真值 [-W括号]

注意,请参阅如何获取特定范围内的随机整数?有关如何rand正确使用的指南。

于 2013-11-14T02:49:52.930 回答
-2

您基本上需要能够伪随机生成 52 个数字,而无需重复。这是一种方法...

首先,将随机数生成器循环 52 次,并使用一种方法确保没有随机数重复。除了 main() 之外的两个函数将有助于做到这一点:

#include <ansi_c.h>
int NotUsedRecently (int number);
int randomGenerator(int min, int max);

int main(void)
{
    int i;
    for(i=0;i<52;i++)
    {
        printf("Card %d :%d\n",i+1, randomGenerator(1, 52));
    }

    getchar();

    return 0;   
}
int randomGenerator(int min, int max)
{
    int random=0, trying=0;

    trying = 1;         
    while(trying)
    {

        srand(clock());
        random = (rand()/32767.0)*(max+1);
        ((random >= min)&&(NotUsedRecently(random))) ? (trying = 0) : (trying = 1);
    }

    return random;
}

int NotUsedRecently (int number)
{
    static int recent[1000];//make sure this index is at least > the number of values in array you are trying to fill 
    int i,j;
    int notUsed = 1;

    for(i=0;i<(sizeof(recent)/sizeof(recent[0]));i++)  (number != recent[i]) ? (notUsed==notUsed) : (notUsed=0, i=(sizeof(recent)/sizeof(recent[0])));
    if(notUsed) 
    {
        for(j=(sizeof(recent)/sizeof(recent[0]));j>1;j--)
        {
            recent[j-1] = recent[j-2];
        }
        recent[j-1] = number;
    }
    return notUsed;
}
于 2013-11-14T03:30:10.060 回答