如何在没有重复的情况下制作1到9之间的随机生成数

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

#include  #include  #include  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的问题,使最后两个数字相同! 谁能帮我 ??

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

 #include  #include  #include  #define RANGE 9 // range of numbers int main() { int pool[RANGE]; int size, n; for (size=0; size 

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

 #include  #include  #include  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; } 

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

 #include  #include  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; }