如何在1到9之间进行随机生成数而不重复

时间:2015-01-09 18:50:45

标签: c

我在网站上搜索这个问题,其中一个对我有所帮助。 我想制作一个1至9之间随机数的拼图,我使用这种方法:

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

int main()  {
   int i = 1, num[9] = {1,2,3,4,5,6,7,8,9}, k = 1;

   srand(time(NULL));
   for (i = 1; i < 10; i++) {
      num[i] = i;
   }
   for (i = 1; i < 10; i++) {
      int j = i + rand()%(10 - i);
      int temp = num[i];
      num[i] = num[j];
      num[j] = temp;

      if ((i - 1) % 3 == 0)
      {
         printf(" %i: ", k);
         k++;
      }


      printf(" %i", num[i]);

      if (i % 3 == 0)
      {
         printf("\n");
      }
   }
   return 0;
}

但我有这个code.it的问题,使最后两个数字相同! 谁能帮助我?

2 个答案:

答案 0 :(得分:3)

您可以像这样生成一系列独特的随机数。它的工作原理是创建一个包含所有可用数字的池,随机选择一个,然后从池中删除该数字。同样的方法可以用来处理一副牌,而不需要明确地改组。

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

#define RANGE   9                   // range of numbers

int main() {
    int pool[RANGE];
    int size, n;
    for (size=0; size<RANGE; size++) {
        pool[size] = size+1;        // create number pool 1...
    }
    srand((unsigned)time(NULL));
    while (size) {                  // generate random sequence
        n = rand() % size;          // random array index
        printf("%d ", pool[n]);     // select number from pool
        pool[n] = pool[--size];     // remove from pool
    }
    printf("\n");
    return 0;
}

这也是您程序的调试版本。除了错误的数组索引之外,你的错误是在随机化完成之前从数组中打印。

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

int main()  {
    int i = 1, num[9] = {1,2,3,4,5,6,7,8,9};

    srand((unsigned)time(NULL));
    for (i=0; i<9; i++) {
        int j = rand() % 9;
        int temp = num[i];
        num[i] = num[j];
        num[j] = temp;
    }

    for (i=0; i<9; i++) {
        if (i % 3 == 0)
            printf("\n %d: ", 1+i/3);
        printf(" %i", num[i]);
    }
    printf("\n");
    return 0;
}

答案 1 :(得分:0)

@Weather Vane的答案是时间有效的,但是如果你需要保留随机序列,而不是简单地输出它,你需要第二个数组来复制数据。以下内容将“就地”数据洗牌:

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

void shuffle( int* pack, int length )
{
    int i ;

    // Initialise pack
    for( i = 0; i < length; i++ )
    {
        pack[i] = i + 1 ;
    }

    // Swap random pairs
    for( i = 0; i < length; i++ )
    {
        int n = rand() % length ;
        int m = rand() % length ;
        int h = pack[n] ;
        pack[n] = pack[m] ;
        pack[m] = h ;
    }
}

#define PACK_LENGTH 9 

int main(void) 
{
    int i ;
    int pack[PACK_LENGTH] ;

    srand( time(0) ) ;

    // Create and shuffle the pack
    shuffle( pack, pack_length ) ;

    // Print the pack
    for( i = 0; i < pack_length; i++ )
    {
        printf( "%d ", pack[i] ) ;
    }

    return 0;
}