试图编写一个函数来改变C中的牌组

时间:2013-11-14 02:44:03

标签: c arrays random shuffle

所以我要做的就是从用户那里获取要使用多少张卡的输入,然后将每张卡随机分配到阵列中的不同索引。我有很多问题让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;
    }

2 个答案:

答案 0 :(得分:0)

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

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

此循环永远不会执行,因为您使用了分配(=)并将i设置为0因此条件将始终为 false ,尽管使用在这种情况下,平等(==)仍然是 false ,你可能想要:

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

这意味着您将使用deck单位化undefined behavior。一旦你修好了,你就会遇到类似的问题:

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

main必须返回int,最后您的return需要提供值。

启用警告应该可以让您找到大部分问题,例如使用-Wallgccfor循环提供以下警告:

  

警告:建议用作真值的赋值括号[-Whatarentheses]

注意,有关如何正确使用rand的指导,请参阅How can I get random integers in a certain range?

答案 1 :(得分:-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;
}